From a35bbebd6ce8157b64e1d9e4834033735eaa2944 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Sat, 28 Oct 2023 20:51:31 +0800 Subject: [PATCH 01/19] feat(website): add metric api doc --- content/cn/docs/clients/restful-api/_index.md | 2 + .../cn/docs/clients/restful-api/metrics.md | 1314 ++++++++++++++++ content/en/docs/clients/restful-api/_index.md | 2 + .../en/docs/clients/restful-api/metrics.md | 1315 +++++++++++++++++ 4 files changed, 2633 insertions(+) create mode 100644 content/cn/docs/clients/restful-api/metrics.md create mode 100644 content/en/docs/clients/restful-api/metrics.md diff --git a/content/cn/docs/clients/restful-api/_index.md b/content/cn/docs/clients/restful-api/_index.md index 85788b666..08d554395 100644 --- a/content/cn/docs/clients/restful-api/_index.md +++ b/content/cn/docs/clients/restful-api/_index.md @@ -43,4 +43,6 @@ HugeGraph-Server通过HugeGraph-API基于HTTP协议为Client提供操作图的 [comment]: <> (- [Authentication](restful-api/auth.md)) +[comment]: <> (- [Metrics](restful-api/metrics.md)) + [comment]: <> (- [Other](restful-api/other.md)) diff --git a/content/cn/docs/clients/restful-api/metrics.md b/content/cn/docs/clients/restful-api/metrics.md new file mode 100644 index 000000000..9a4e8e0b4 --- /dev/null +++ b/content/cn/docs/clients/restful-api/metrics.md @@ -0,0 +1,1314 @@ +--- +title: "Metrics API" +linkTitle: "Metrics" +weight: 1 + +--- + +HugeGraph 提供Metrics 信息披露,包括:基础指标、统计指标、系统指标、后端指标。 + + +## 1. 基础指标 + +### 1.1 获取所有基础指标 + + +##### Params + +- type:如果传值为json,则以json格式返回,否则以Promethaus格式返回。 + +##### 1.1.1 Method & Url + +``` +http://localhost:8080/metrics/?type=json +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "gauges":{ + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity":{ + "value":1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances":{ + "value":7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity":{ + "value":10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size":{ + "value":17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity":{ + "value":10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size":{ + "value":17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity":{ + "value":10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads":{ + "value":0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks":{ + "value":0 + }, + "org.apache.hugegraph.task.TaskManager.workers":{ + "value":4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty":{ + "value":922769200 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate":{ + "value":1 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time":{ + "value":1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions":{ + "value":0 + } + }, + "counters":{ + "favicon.ico/GET/FAILED_COUNTER":{ + "count":1 + }, + "favicon.ico/GET/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/POST/FAILED_COUNTER":{ + "count":1 + }, + "metrics/POST/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/backend/GET/SUCCESS_COUNTER":{ + "count":2 + }, + "metrics/backend/GET/TOTAL_COUNTER":{ + "count":2 + }, + "metrics/gauges/GET/SUCCESS_COUNTER":{ + "count":1 + }, + "metrics/gauges/GET/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/system/GET/SUCCESS_COUNTER":{ + "count":2 + }, + "metrics/system/GET/TOTAL_COUNTER":{ + "count":2 + }, + "system/GET/FAILED_COUNTER":{ + "count":1 + }, + "system/GET/TOTAL_COUNTER":{ + "count":1 + } + }, + "histograms":{ + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":1, + "mean":1, + "max":1, + "stddev":0, + "p50":1, + "p75":1, + "p95":1, + "p98":1, + "p99":1, + "p999":1 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":21, + "mean":21, + "max":21, + "stddev":0, + "p50":21, + "p75":21, + "p95":21, + "p98":21, + "p99":21, + "p999":21 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":2, + "min":6, + "mean":12.6852124529148, + "max":20, + "stddev":6.992918475157571, + "p50":6, + "p75":20, + "p95":20, + "p98":20, + "p99":20, + "p999":20 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":7, + "mean":7, + "max":7, + "stddev":0, + "p50":7, + "p75":7, + "p95":7, + "p98":7, + "p99":7, + "p999":7 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":2, + "min":0, + "mean":8.942674506664073, + "max":40, + "stddev":16.665399873223066, + "p50":0, + "p75":0, + "p95":40, + "p98":40, + "p99":40, + "p999":40 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":2, + "mean":2, + "max":2, + "stddev":0, + "p50":2, + "p75":2, + "p95":2, + "p98":2, + "p99":2, + "p999":2 + } + }, + "meters":{ + "org.apache.hugegraph.api.API.commit-succeed":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.expected-error":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.unknown-error":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + } + }, + "timers":{ + "org.apache.hugegraph.api.auth.AccessAPI.create":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.get":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.list":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + ... + } +} +``` + +##### 1.1.2 Method & Url + +``` +http://localhost:8080/metrics/ + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +# HELP hugegraph_info +# TYPE hugegraph_info untyped +hugegraph_info{version="0.69",} 1.0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity 1000000 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire 600000 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size 0 +# HELP org_apache_hugegraph_backend_cache_Cache_instances +# TYPE org_apache_hugegraph_backend_cache_Cache_instances gauge +org_apache_hugegraph_backend_cache_Cache_instances 7 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity 10000 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size 17 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity 10000 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size 17 +... +``` + +### 1.2 获取Gauges指标 + +##### Method & Url + +``` +http://localhost:8080/metrics/gauges + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 9.227692E8 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 + } +} +``` + +### 1.3 获取Counters指标 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/counters + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "favicon.ico/GET/FAILED_COUNTER": { + "count": 1 + }, + "favicon.ico/GET/TOTAL_COUNTER": { + "count": 1 + }, + "metrics//GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics//GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/POST/FAILED_COUNTER": { + "count": 1 + }, + "metrics/POST/TOTAL_COUNTER": { + "count": 1 + }, + "metrics/backend/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/backend/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/gauges/GET/SUCCESS_COUNTER": { + "count": 1 + }, + "metrics/gauges/GET/TOTAL_COUNTER": { + "count": 1 + }, + "metrics/statistics/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/statistics/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/system/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/system/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/timers/GET/SUCCESS_COUNTER": { + "count": 1 + }, + "metrics/timers/GET/TOTAL_COUNTER": { + "count": 1 + }, + "system/GET/FAILED_COUNTER": { + "count": 1 + }, + "system/GET/TOTAL_COUNTER": { + "count": 1 + } +} +``` + +### 1.4 获取histograms指标 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/gauges + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 1, + "mean": 1.0, + "max": 1, + "stddev": 0.0, + "p50": 1.0, + "p75": 1.0, + "p95": 1.0, + "p98": 1.0, + "p99": 1.0, + "p999": 1.0 + }, + "metrics//GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 10, + "mean": 10.0, + "max": 10, + "stddev": 0.0, + "p50": 10.0, + "p75": 10.0, + "p95": 10.0, + "p98": 10.0, + "p99": 10.0, + "p999": 10.0 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 21, + "mean": 21.0, + "max": 21, + "stddev": 0.0, + "p50": 21.0, + "p75": 21.0, + "p95": 21.0, + "p98": 21.0, + "p99": 21.0, + "p999": 21.0 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 6, + "mean": 12.6852124529148, + "max": 20, + "stddev": 6.992918475157571, + "p50": 6.0, + "p75": 20.0, + "p95": 20.0, + "p98": 20.0, + "p99": 20.0, + "p999": 20.0 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 7, + "mean": 7.0, + "max": 7, + "stddev": 0.0, + "p50": 7.0, + "p75": 7.0, + "p95": 7.0, + "p98": 7.0, + "p99": 7.0, + "p999": 7.0 + }, + "metrics/statistics/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 1, + "mean": 1.4551211076264199, + "max": 2, + "stddev": 0.49798181193626, + "p50": 1.0, + "p75": 2.0, + "p95": 2.0, + "p98": 2.0, + "p99": 2.0, + "p999": 2.0 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 0, + "mean": 8.942674506664073, + "max": 40, + "stddev": 16.665399873223066, + "p50": 0.0, + "p75": 0.0, + "p95": 40.0, + "p98": 40.0, + "p99": 40.0, + "p999": 40.0 + }, + "metrics/timers/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 3, + "mean": 3.0, + "max": 3, + "stddev": 0.0, + "p50": 3.0, + "p75": 3.0, + "p95": 3.0, + "p98": 3.0, + "p99": 3.0, + "p999": 3.0 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 2, + "mean": 2.0, + "max": 2, + "stddev": 0.0, + "p50": 2.0, + "p75": 2.0, + "p95": 2.0, + "p98": 2.0, + "p99": 2.0, + "p999": 2.0 + } +} +``` + +### 1.5 获取meters指标 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/meters + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.api.API.commit-succeed": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.expected-error": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.unknown-error": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + } +} +``` + +### 1.6 获取timers指标 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/timers + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.api.auth.AccessAPI.create": { + "count": 0, + "min": 0.0, + "mean": 0.0, + "max": 0.0, + "stddev": 0.0, + "p50": 0.0, + "p75": 0.0, + "p95": 0.0, + "p98": 0.0, + "p99": 0.0, + "p999": 0.0, + "duration_unit": "milliseconds", + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete": { + "count": 0, + "min": 0.0, + "mean": 0.0, + "max": 0.0, + "stddev": 0.0, + "p50": 0.0, + "p75": 0.0, + "p95": 0.0, + "p98": 0.0, + "p99": 0.0, + "p999": 0.0, + "duration_unit": "milliseconds", + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "calls/second" + }, + + ... + +} +``` + +## 2.统计指标 + +##### Params + +- type:如果传值为json,则以json格式返回,否则以Promethaus格式返回。 + +##### 2.1 Method & Url + +``` +GET http://localhost:8080/metrics/statistics +``` + +##### Response Status + +```json +# HELP hugegraph_info +# TYPE hugegraph_info untyped +hugegraph_info{version="0.69",} 1.0 +# HELP metrics_POST +# TYPE metrics_POST gauge +metrics_POST{name=FAILED_REQUEST,} 1 +metrics_POST{name=MEAN_RESPONSE_TIME,} 21.0 +metrics_POST{name=MAX_RESPONSE_TIME,} 21 +metrics_POST{name=SUCCESS_REQUEST,} 0 +metrics_POST{name=TOTAL_REQUEST,} 1 +# HELP metrics_backend_GET +# TYPE metrics_backend_GET gauge +metrics_backend_GET{name=FAILED_REQUEST,} 0 +metrics_backend_GET{name=MEAN_RESPONSE_TIME,} 12.6852124529148 +metrics_backend_GET{name=MAX_RESPONSE_TIME,} 20 +metrics_backend_GET{name=SUCCESS_REQUEST,} 2 +metrics_backend_GET{name=TOTAL_REQUEST,} 2 +# HELP system_GET +# TYPE system_GET gauge +system_GET{name=FAILED_REQUEST,} 1 +system_GET{name=MEAN_RESPONSE_TIME,} 2.0 +system_GET{name=MAX_RESPONSE_TIME,} 2 +system_GET{name=SUCCESS_REQUEST,} 0 +system_GET{name=TOTAL_REQUEST,} 1 +# HELP metrics_gauges_GET +# TYPE metrics_gauges_GET gauge +metrics_gauges_GET{name=FAILED_REQUEST,} 0 +metrics_gauges_GET{name=MEAN_RESPONSE_TIME,} 7.0 +metrics_gauges_GET{name=MAX_RESPONSE_TIME,} 7 +metrics_gauges_GET{name=SUCCESS_REQUEST,} 1 +metrics_gauges_GET{name=TOTAL_REQUEST,} 1 +# HELP favicon.ico_GET +# TYPE favicon.ico_GET gauge +favicon.ico_GET{name=FAILED_REQUEST,} 1 +favicon.ico_GET{name=MEAN_RESPONSE_TIME,} 1.0 +favicon.ico_GET{name=MAX_RESPONSE_TIME,} 1 +favicon.ico_GET{name=SUCCESS_REQUEST,} 0 +favicon.ico_GET{name=TOTAL_REQUEST,} 1 +# HELP metrics__GET +# TYPE metrics__GET gauge +metrics__GET{name=FAILED_REQUEST,} 0 +metrics__GET{name=MEAN_RESPONSE_TIME,} 10.0 +metrics__GET{name=MAX_RESPONSE_TIME,} 10 +metrics__GET{name=SUCCESS_REQUEST,} 2 +metrics__GET{name=TOTAL_REQUEST,} 2 +# HELP metrics_system_GET +# TYPE metrics_system_GET gauge +metrics_system_GET{name=FAILED_REQUEST,} 0 +metrics_system_GET{name=MEAN_RESPONSE_TIME,} 8.942674506664073 +metrics_system_GET{name=MAX_RESPONSE_TIME,} 40 +metrics_system_GET{name=SUCCESS_REQUEST,} 2 +metrics_system_GET{name=TOTAL_REQUEST,} 2 + +``` + +##### Response Body + +```json +200 +``` + +##### 2.2 Method & Url + +``` +GET http://localhost:8080/metrics/statistics?type=json +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "metrics/POST":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":21, + "MAX_RESPONSE_TIME":21, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics/backend/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":12.6852124529148, + "MAX_RESPONSE_TIME":20, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + }, + "system/GET":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":2, + "MAX_RESPONSE_TIME":2, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics/gauges/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":7, + "MAX_RESPONSE_TIME":7, + "SUCCESS_REQUEST":1, + "TOTAL_REQUEST":1 + }, + "favicon.ico/GET":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":1, + "MAX_RESPONSE_TIME":1, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics//GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":10, + "MAX_RESPONSE_TIME":10, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + }, + "metrics/system/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":8.942674506664073, + "MAX_RESPONSE_TIME":40, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + } +} +``` + + + +## 3.系统指标 + +系统指标主要返回机器运行指标,如内存、线程等信息。 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/system +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "basic": { + "mem": 1010, + "mem_total": 911, + "mem_used": 239, + "mem_free": 671, + "mem_unit": "MB", + "processors": 20, + "uptime": 137503, + "systemload_average": -1.0 + }, + "heap": { + "committed": 911, + "init": 254, + "used": 239, + "max": 3596 + }, + "nonheap": { + "committed": 98, + "init": 2, + "used": 95, + "max": 0 + }, + "thread": { + "peak": 82, + "daemon": 34, + "total_started": 108, + "count": 82 + }, + "class_loading": { + "count": 11495, + "loaded": 11495, + "unloaded": 0 + }, + "garbage_collector": { + "ps_scavenge_count": 16, + "ps_scavenge_time": 155, + "ps_marksweep_count": 3, + "ps_marksweep_time": 494, + "time_unit": "ms" + } +} +``` + + + +## 4.后端指标 + +hugeGraph支持多种后端存储,后端指标包括内存、磁盘等信息。 + +##### Method & Url + +``` +GET http://localhost:8080/metrics/backend +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "hugegraph": { + "backend": "rocksdb", + "nodes": 1, + "cluster_id": "local", + "servers": { + "local": { + "mem_unit": "MB", + "disk_unit": "GB", + "mem_used": 0.1, + "mem_used_readable": "103.53 KB", + "disk_usage": 0.03, + "disk_usage_readable": "29.03 KB", + "block_cache_usage": 0.00359344482421875, + "block_cache_pinned_usage": 0.00359344482421875, + "block_cache_capacity": 304.0, + "estimate_table_readers_mem": 0.019697189331054688, + "size_all_mem_tables": 0.07421875, + "cur_size_all_mem_tables": 0.07421875, + "estimate_live_data_size": 5.536526441574097E-5, + "total_sst_files_size": 5.536526441574097E-5, + "live_sst_files_size": 5.536526441574097E-5, + "estimate_pending_compaction_bytes": 0.0, + "estimate_num_keys": 0, + "num_entries_active_mem_table": 0, + "num_entries_imm_mem_tables": 0, + "num_deletes_active_mem_table": 0, + "num_deletes_imm_mem_tables": 0, + "num_running_flushes": 0, + "mem_table_flush_pending": 0, + "num_running_compactions": 0, + "compaction_pending": 0, + "num_immutable_mem_table": 0, + "num_snapshots": 0, + "oldest_snapshot_time": 0, + "num_live_versions": 38, + "current_super_version_number": 38 + } + } + } +} +``` + diff --git a/content/en/docs/clients/restful-api/_index.md b/content/en/docs/clients/restful-api/_index.md index 9265a3450..75d655631 100644 --- a/content/en/docs/clients/restful-api/_index.md +++ b/content/en/docs/clients/restful-api/_index.md @@ -42,4 +42,6 @@ HugeGraph-Server provides interfaces for clients to operate on graphs based on t [comment]: <> (- [Authentication](restful-api/auth.md)) +[comment]: <> (- [Metrics](restful-api/metrics.md)) + [comment]: <> (- [Other](restful-api/other.md)) diff --git a/content/en/docs/clients/restful-api/metrics.md b/content/en/docs/clients/restful-api/metrics.md new file mode 100644 index 000000000..b1ae0aa77 --- /dev/null +++ b/content/en/docs/clients/restful-api/metrics.md @@ -0,0 +1,1315 @@ +--- +title: "Metrics API" +linkTitle: "Metrics" +weight: 1 + +--- + +HugeGraph provides metrics info, including basic metrics, statistical metrics, system metrics, and backend metrics. + + +## 1. Basic Metrics + +### 1.1 Get All Basic Metrics + + +##### Params + +- type:If the passed value is JSON, it is returned in JSON format, otherwise it is returned in Promethaus format. + +##### 1.1.1 Method & Url + +``` +http://localhost:8080/metrics/?type=json +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "gauges":{ + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity":{ + "value":1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances":{ + "value":7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity":{ + "value":10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size":{ + "value":17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity":{ + "value":10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size":{ + "value":17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity":{ + "value":10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity":{ + "value":10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire":{ + "value":600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss":{ + "value":0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size":{ + "value":0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads":{ + "value":0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks":{ + "value":0 + }, + "org.apache.hugegraph.task.TaskManager.workers":{ + "value":4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty":{ + "value":922769200 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count":{ + "value":0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate":{ + "value":1 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count":{ + "value":2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time":{ + "value":1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions":{ + "value":0 + } + }, + "counters":{ + "favicon.ico/GET/FAILED_COUNTER":{ + "count":1 + }, + "favicon.ico/GET/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/POST/FAILED_COUNTER":{ + "count":1 + }, + "metrics/POST/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/backend/GET/SUCCESS_COUNTER":{ + "count":2 + }, + "metrics/backend/GET/TOTAL_COUNTER":{ + "count":2 + }, + "metrics/gauges/GET/SUCCESS_COUNTER":{ + "count":1 + }, + "metrics/gauges/GET/TOTAL_COUNTER":{ + "count":1 + }, + "metrics/system/GET/SUCCESS_COUNTER":{ + "count":2 + }, + "metrics/system/GET/TOTAL_COUNTER":{ + "count":2 + }, + "system/GET/FAILED_COUNTER":{ + "count":1 + }, + "system/GET/TOTAL_COUNTER":{ + "count":1 + } + }, + "histograms":{ + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":1, + "mean":1, + "max":1, + "stddev":0, + "p50":1, + "p75":1, + "p95":1, + "p98":1, + "p99":1, + "p999":1 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":21, + "mean":21, + "max":21, + "stddev":0, + "p50":21, + "p75":21, + "p95":21, + "p98":21, + "p99":21, + "p999":21 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":2, + "min":6, + "mean":12.6852124529148, + "max":20, + "stddev":6.992918475157571, + "p50":6, + "p75":20, + "p95":20, + "p98":20, + "p99":20, + "p999":20 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":7, + "mean":7, + "max":7, + "stddev":0, + "p50":7, + "p75":7, + "p95":7, + "p98":7, + "p99":7, + "p999":7 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":2, + "min":0, + "mean":8.942674506664073, + "max":40, + "stddev":16.665399873223066, + "p50":0, + "p75":0, + "p95":40, + "p98":40, + "p99":40, + "p999":40 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM":{ + "count":1, + "min":2, + "mean":2, + "max":2, + "stddev":0, + "p50":2, + "p75":2, + "p95":2, + "p98":2, + "p99":2, + "p999":2 + } + }, + "meters":{ + "org.apache.hugegraph.api.API.commit-succeed":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.expected-error":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.hugegraph.api.API.unknown-error":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors":{ + "count":0, + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"events/second" + } + }, + "timers":{ + "org.apache.hugegraph.api.auth.AccessAPI.create":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.get":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.list":{ + "count":0, + "min":0, + "mean":0, + "max":0, + "stddev":0, + "p50":0, + "p75":0, + "p95":0, + "p98":0, + "p99":0, + "p999":0, + "duration_unit":"milliseconds", + "mean_rate":0, + "m15_rate":0, + "m5_rate":0, + "m1_rate":0, + "rate_unit":"calls/second" + }, + ... + } +} +``` + +##### 1.1.2 Method & Url + +``` +http://localhost:8080/metrics/ + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +# HELP hugegraph_info +# TYPE hugegraph_info untyped +hugegraph_info{version="0.69",} 1.0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity 1000000 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_expire 600000 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_size 0 +# HELP org_apache_hugegraph_backend_cache_Cache_instances +# TYPE org_apache_hugegraph_backend_cache_Cache_instances gauge +org_apache_hugegraph_backend_cache_Cache_instances 7 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_capacity 10000 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_expire 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_schema_id_hugegraph_size 17 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_capacity 10000 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_expire 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_hits 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_miss 0 +# HELP org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size +# TYPE org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size gauge +org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size 17 +... +``` + +### 1.2 Get Gauges Metrics + +##### Method & Url + +``` +http://localhost:8080/metrics/gauges + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 9.227692E8 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 + } +} +``` + +### 1.3 Get Counters Metrics + +##### Method & Url + +``` +GET http://localhost:8080/metrics/counters + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "favicon.ico/GET/FAILED_COUNTER": { + "count": 1 + }, + "favicon.ico/GET/TOTAL_COUNTER": { + "count": 1 + }, + "metrics//GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics//GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/POST/FAILED_COUNTER": { + "count": 1 + }, + "metrics/POST/TOTAL_COUNTER": { + "count": 1 + }, + "metrics/backend/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/backend/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/gauges/GET/SUCCESS_COUNTER": { + "count": 1 + }, + "metrics/gauges/GET/TOTAL_COUNTER": { + "count": 1 + }, + "metrics/statistics/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/statistics/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/system/GET/SUCCESS_COUNTER": { + "count": 2 + }, + "metrics/system/GET/TOTAL_COUNTER": { + "count": 2 + }, + "metrics/timers/GET/SUCCESS_COUNTER": { + "count": 1 + }, + "metrics/timers/GET/TOTAL_COUNTER": { + "count": 1 + }, + "system/GET/FAILED_COUNTER": { + "count": 1 + }, + "system/GET/TOTAL_COUNTER": { + "count": 1 + } +} +``` + +### 1.4 Get Histograms Metrics + +##### Method & Url + +``` +GET http://localhost:8080/metrics/gauges + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 1, + "mean": 1.0, + "max": 1, + "stddev": 0.0, + "p50": 1.0, + "p75": 1.0, + "p95": 1.0, + "p98": 1.0, + "p99": 1.0, + "p999": 1.0 + }, + "metrics//GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 10, + "mean": 10.0, + "max": 10, + "stddev": 0.0, + "p50": 10.0, + "p75": 10.0, + "p95": 10.0, + "p98": 10.0, + "p99": 10.0, + "p999": 10.0 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 21, + "mean": 21.0, + "max": 21, + "stddev": 0.0, + "p50": 21.0, + "p75": 21.0, + "p95": 21.0, + "p98": 21.0, + "p99": 21.0, + "p999": 21.0 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 6, + "mean": 12.6852124529148, + "max": 20, + "stddev": 6.992918475157571, + "p50": 6.0, + "p75": 20.0, + "p95": 20.0, + "p98": 20.0, + "p99": 20.0, + "p999": 20.0 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 7, + "mean": 7.0, + "max": 7, + "stddev": 0.0, + "p50": 7.0, + "p75": 7.0, + "p95": 7.0, + "p98": 7.0, + "p99": 7.0, + "p999": 7.0 + }, + "metrics/statistics/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 1, + "mean": 1.4551211076264199, + "max": 2, + "stddev": 0.49798181193626, + "p50": 1.0, + "p75": 2.0, + "p95": 2.0, + "p98": 2.0, + "p99": 2.0, + "p999": 2.0 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 0, + "mean": 8.942674506664073, + "max": 40, + "stddev": 16.665399873223066, + "p50": 0.0, + "p75": 0.0, + "p95": 40.0, + "p98": 40.0, + "p99": 40.0, + "p999": 40.0 + }, + "metrics/timers/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 3, + "mean": 3.0, + "max": 3, + "stddev": 0.0, + "p50": 3.0, + "p75": 3.0, + "p95": 3.0, + "p98": 3.0, + "p99": 3.0, + "p999": 3.0 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 2, + "mean": 2.0, + "max": 2, + "stddev": 0.0, + "p50": 2.0, + "p75": 2.0, + "p95": 2.0, + "p98": 2.0, + "p99": 2.0, + "p999": 2.0 + } +} +``` + +### 1.5 Get Meters Metrics + +##### Method & Url + +``` +GET http://localhost:8080/metrics/meters + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.api.API.commit-succeed": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.expected-error": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.unknown-error": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors": { + "count": 0, + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "events/second" + } +} +``` + +### 1.6 Get Timers Metrics + +##### Method & Url + +``` +GET http://localhost:8080/metrics/timers + +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "org.apache.hugegraph.api.auth.AccessAPI.create": { + "count": 0, + "min": 0.0, + "mean": 0.0, + "max": 0.0, + "stddev": 0.0, + "p50": 0.0, + "p75": 0.0, + "p95": 0.0, + "p98": 0.0, + "p99": 0.0, + "p999": 0.0, + "duration_unit": "milliseconds", + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete": { + "count": 0, + "min": 0.0, + "mean": 0.0, + "max": 0.0, + "stddev": 0.0, + "p50": 0.0, + "p75": 0.0, + "p95": 0.0, + "p98": 0.0, + "p99": 0.0, + "p999": 0.0, + "duration_unit": "milliseconds", + "mean_rate": 0.0, + "m15_rate": 0.0, + "m5_rate": 0.0, + "m1_rate": 0.0, + "rate_unit": "calls/second" + }, + + ... + +} +``` + +## 2.Statistical Metrics + +##### Params + +- type:If the passed value is JSON, it is returned in JSON format, otherwise it is returned in +Promethaus format. + +##### 2.1 Method & Url + +``` +GET http://localhost:8080/metrics/statistics +``` + +##### Response Status + +```json +# HELP hugegraph_info +# TYPE hugegraph_info untyped +hugegraph_info{version="0.69",} 1.0 +# HELP metrics_POST +# TYPE metrics_POST gauge +metrics_POST{name=FAILED_REQUEST,} 1 +metrics_POST{name=MEAN_RESPONSE_TIME,} 21.0 +metrics_POST{name=MAX_RESPONSE_TIME,} 21 +metrics_POST{name=SUCCESS_REQUEST,} 0 +metrics_POST{name=TOTAL_REQUEST,} 1 +# HELP metrics_backend_GET +# TYPE metrics_backend_GET gauge +metrics_backend_GET{name=FAILED_REQUEST,} 0 +metrics_backend_GET{name=MEAN_RESPONSE_TIME,} 12.6852124529148 +metrics_backend_GET{name=MAX_RESPONSE_TIME,} 20 +metrics_backend_GET{name=SUCCESS_REQUEST,} 2 +metrics_backend_GET{name=TOTAL_REQUEST,} 2 +# HELP system_GET +# TYPE system_GET gauge +system_GET{name=FAILED_REQUEST,} 1 +system_GET{name=MEAN_RESPONSE_TIME,} 2.0 +system_GET{name=MAX_RESPONSE_TIME,} 2 +system_GET{name=SUCCESS_REQUEST,} 0 +system_GET{name=TOTAL_REQUEST,} 1 +# HELP metrics_gauges_GET +# TYPE metrics_gauges_GET gauge +metrics_gauges_GET{name=FAILED_REQUEST,} 0 +metrics_gauges_GET{name=MEAN_RESPONSE_TIME,} 7.0 +metrics_gauges_GET{name=MAX_RESPONSE_TIME,} 7 +metrics_gauges_GET{name=SUCCESS_REQUEST,} 1 +metrics_gauges_GET{name=TOTAL_REQUEST,} 1 +# HELP favicon.ico_GET +# TYPE favicon.ico_GET gauge +favicon.ico_GET{name=FAILED_REQUEST,} 1 +favicon.ico_GET{name=MEAN_RESPONSE_TIME,} 1.0 +favicon.ico_GET{name=MAX_RESPONSE_TIME,} 1 +favicon.ico_GET{name=SUCCESS_REQUEST,} 0 +favicon.ico_GET{name=TOTAL_REQUEST,} 1 +# HELP metrics__GET +# TYPE metrics__GET gauge +metrics__GET{name=FAILED_REQUEST,} 0 +metrics__GET{name=MEAN_RESPONSE_TIME,} 10.0 +metrics__GET{name=MAX_RESPONSE_TIME,} 10 +metrics__GET{name=SUCCESS_REQUEST,} 2 +metrics__GET{name=TOTAL_REQUEST,} 2 +# HELP metrics_system_GET +# TYPE metrics_system_GET gauge +metrics_system_GET{name=FAILED_REQUEST,} 0 +metrics_system_GET{name=MEAN_RESPONSE_TIME,} 8.942674506664073 +metrics_system_GET{name=MAX_RESPONSE_TIME,} 40 +metrics_system_GET{name=SUCCESS_REQUEST,} 2 +metrics_system_GET{name=TOTAL_REQUEST,} 2 + +``` + +##### Response Body + +```json +200 +``` + +##### 2.2 Method & Url + +``` +GET http://localhost:8080/metrics/statistics?type=json +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "metrics/POST":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":21, + "MAX_RESPONSE_TIME":21, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics/backend/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":12.6852124529148, + "MAX_RESPONSE_TIME":20, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + }, + "system/GET":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":2, + "MAX_RESPONSE_TIME":2, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics/gauges/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":7, + "MAX_RESPONSE_TIME":7, + "SUCCESS_REQUEST":1, + "TOTAL_REQUEST":1 + }, + "favicon.ico/GET":{ + "FAILED_REQUEST":1, + "MEAN_RESPONSE_TIME":1, + "MAX_RESPONSE_TIME":1, + "SUCCESS_REQUEST":0, + "TOTAL_REQUEST":1 + }, + "metrics//GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":10, + "MAX_RESPONSE_TIME":10, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + }, + "metrics/system/GET":{ + "FAILED_REQUEST":0, + "MEAN_RESPONSE_TIME":8.942674506664073, + "MAX_RESPONSE_TIME":40, + "SUCCESS_REQUEST":2, + "TOTAL_REQUEST":2 + } +} +``` + + + +## 3.System Metrics + +System metrics mainly return the machine metrics, such as memory, threads, and other +information. + +##### Method & Url + +``` +GET http://localhost:8080/metrics/system +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "basic": { + "mem": 1010, + "mem_total": 911, + "mem_used": 239, + "mem_free": 671, + "mem_unit": "MB", + "processors": 20, + "uptime": 137503, + "systemload_average": -1.0 + }, + "heap": { + "committed": 911, + "init": 254, + "used": 239, + "max": 3596 + }, + "nonheap": { + "committed": 98, + "init": 2, + "used": 95, + "max": 0 + }, + "thread": { + "peak": 82, + "daemon": 34, + "total_started": 108, + "count": 82 + }, + "class_loading": { + "count": 11495, + "loaded": 11495, + "unloaded": 0 + }, + "garbage_collector": { + "ps_scavenge_count": 16, + "ps_scavenge_time": 155, + "ps_marksweep_count": 3, + "ps_marksweep_time": 494, + "time_unit": "ms" + } +} +``` + + + +## 4.Backend Metrics + +HugeGraph supports multiple backend storage, with backend metrics including memory, disk, and other information. +##### Method & Url + +``` +GET http://localhost:8080/metrics/backend +``` + +##### Response Status + +```json +200 +``` + +##### Response Body + +```json +{ + "hugegraph": { + "backend": "rocksdb", + "nodes": 1, + "cluster_id": "local", + "servers": { + "local": { + "mem_unit": "MB", + "disk_unit": "GB", + "mem_used": 0.1, + "mem_used_readable": "103.53 KB", + "disk_usage": 0.03, + "disk_usage_readable": "29.03 KB", + "block_cache_usage": 0.00359344482421875, + "block_cache_pinned_usage": 0.00359344482421875, + "block_cache_capacity": 304.0, + "estimate_table_readers_mem": 0.019697189331054688, + "size_all_mem_tables": 0.07421875, + "cur_size_all_mem_tables": 0.07421875, + "estimate_live_data_size": 5.536526441574097E-5, + "total_sst_files_size": 5.536526441574097E-5, + "live_sst_files_size": 5.536526441574097E-5, + "estimate_pending_compaction_bytes": 0.0, + "estimate_num_keys": 0, + "num_entries_active_mem_table": 0, + "num_entries_imm_mem_tables": 0, + "num_deletes_active_mem_table": 0, + "num_deletes_imm_mem_tables": 0, + "num_running_flushes": 0, + "mem_table_flush_pending": 0, + "num_running_compactions": 0, + "compaction_pending": 0, + "num_immutable_mem_table": 0, + "num_snapshots": 0, + "oldest_snapshot_time": 0, + "num_live_versions": 38, + "current_super_version_number": 38 + } + } + } +} +``` + From dfca306e2847e92a67c1e82a881b4605aa19cec6 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Sun, 29 Oct 2023 11:55:20 +0800 Subject: [PATCH 02/19] =?UTF-8?q?feat(website):=20add=20metric=20api=20doc?= =?UTF-8?q?=EF=BC=8Cformat=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/docs/clients/restful-api/metrics.md | 1280 +++++++++-------- .../en/docs/clients/restful-api/metrics.md | 1279 ++++++++-------- 2 files changed, 1311 insertions(+), 1248 deletions(-) diff --git a/content/cn/docs/clients/restful-api/metrics.md b/content/cn/docs/clients/restful-api/metrics.md index 9a4e8e0b4..b523a6689 100644 --- a/content/cn/docs/clients/restful-api/metrics.md +++ b/content/cn/docs/clients/restful-api/metrics.md @@ -5,17 +5,15 @@ weight: 1 --- -HugeGraph 提供Metrics 信息披露,包括:基础指标、统计指标、系统指标、后端指标。 - +HugeGraph 提供关于 Metrics 的信息披露,包括:基础指标、统计指标、系统指标、后端指标。 ## 1. 基础指标 ### 1.1 获取所有基础指标 - ##### Params -- type:如果传值为json,则以json格式返回,否则以Promethaus格式返回。 +- type:如果传值为 json,则以 json 格式返回,否则以 Promethaus 格式返回。 ##### 1.1.1 Method & Url @@ -33,409 +31,409 @@ http://localhost:8080/metrics/?type=json ```json { - "gauges":{ - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity":{ - "value":1000000 + "gauges": { + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.instances":{ - "value":7 + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity":{ - "value":10000 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size":{ - "value":17 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity":{ - "value":10000 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size":{ - "value":17 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity":{ - "value":10000000 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.server.RestServer.max-write-threads":{ - "value":0 + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 }, - "org.apache.hugegraph.task.TaskManager.pending-tasks":{ - "value":0 + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 }, - "org.apache.hugegraph.task.TaskManager.workers":{ - "value":4 + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty":{ - "value":922769200 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 922769200 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate":{ - "value":1 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time":{ - "value":1845538400 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 } }, - "counters":{ - "favicon.ico/GET/FAILED_COUNTER":{ - "count":1 + "counters": { + "favicon.ico/GET/FAILED_COUNTER": { + "count": 1 }, - "favicon.ico/GET/TOTAL_COUNTER":{ - "count":1 + "favicon.ico/GET/TOTAL_COUNTER": { + "count": 1 }, - "metrics/POST/FAILED_COUNTER":{ - "count":1 + "metrics/POST/FAILED_COUNTER": { + "count": 1 }, - "metrics/POST/TOTAL_COUNTER":{ - "count":1 + "metrics/POST/TOTAL_COUNTER": { + "count": 1 }, - "metrics/backend/GET/SUCCESS_COUNTER":{ - "count":2 + "metrics/backend/GET/SUCCESS_COUNTER": { + "count": 2 }, - "metrics/backend/GET/TOTAL_COUNTER":{ - "count":2 + "metrics/backend/GET/TOTAL_COUNTER": { + "count": 2 }, - "metrics/gauges/GET/SUCCESS_COUNTER":{ - "count":1 + "metrics/gauges/GET/SUCCESS_COUNTER": { + "count": 1 }, - "metrics/gauges/GET/TOTAL_COUNTER":{ - "count":1 + "metrics/gauges/GET/TOTAL_COUNTER": { + "count": 1 }, - "metrics/system/GET/SUCCESS_COUNTER":{ - "count":2 + "metrics/system/GET/SUCCESS_COUNTER": { + "count": 2 }, - "metrics/system/GET/TOTAL_COUNTER":{ - "count":2 + "metrics/system/GET/TOTAL_COUNTER": { + "count": 2 }, - "system/GET/FAILED_COUNTER":{ - "count":1 + "system/GET/FAILED_COUNTER": { + "count": 1 }, - "system/GET/TOTAL_COUNTER":{ - "count":1 + "system/GET/TOTAL_COUNTER": { + "count": 1 } }, - "histograms":{ - "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":1, - "mean":1, - "max":1, - "stddev":0, - "p50":1, - "p75":1, - "p95":1, - "p98":1, - "p99":1, - "p999":1 - }, - "metrics/POST/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":21, - "mean":21, - "max":21, - "stddev":0, - "p50":21, - "p75":21, - "p95":21, - "p98":21, - "p99":21, - "p999":21 - }, - "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":2, - "min":6, - "mean":12.6852124529148, - "max":20, - "stddev":6.992918475157571, - "p50":6, - "p75":20, - "p95":20, - "p98":20, - "p99":20, - "p999":20 - }, - "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":7, - "mean":7, - "max":7, - "stddev":0, - "p50":7, - "p75":7, - "p95":7, - "p98":7, - "p99":7, - "p999":7 - }, - "metrics/system/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":2, - "min":0, - "mean":8.942674506664073, - "max":40, - "stddev":16.665399873223066, - "p50":0, - "p75":0, - "p95":40, - "p98":40, - "p99":40, - "p999":40 - }, - "system/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":2, - "mean":2, - "max":2, - "stddev":0, - "p50":2, - "p75":2, - "p95":2, - "p98":2, - "p99":2, - "p999":2 + "histograms": { + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 1, + "mean": 1, + "max": 1, + "stddev": 0, + "p50": 1, + "p75": 1, + "p95": 1, + "p98": 1, + "p99": 1, + "p999": 1 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 21, + "mean": 21, + "max": 21, + "stddev": 0, + "p50": 21, + "p75": 21, + "p95": 21, + "p98": 21, + "p99": 21, + "p999": 21 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 6, + "mean": 12.6852124529148, + "max": 20, + "stddev": 6.992918475157571, + "p50": 6, + "p75": 20, + "p95": 20, + "p98": 20, + "p99": 20, + "p999": 20 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 7, + "mean": 7, + "max": 7, + "stddev": 0, + "p50": 7, + "p75": 7, + "p95": 7, + "p98": 7, + "p99": 7, + "p999": 7 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 0, + "mean": 8.942674506664073, + "max": 40, + "stddev": 16.665399873223066, + "p50": 0, + "p75": 0, + "p95": 40, + "p98": 40, + "p99": 40, + "p999": 40 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 2, + "mean": 2, + "max": 2, + "stddev": 0, + "p50": 2, + "p75": 2, + "p95": 2, + "p98": 2, + "p99": 2, + "p999": 2 } }, - "meters":{ - "org.apache.hugegraph.api.API.commit-succeed":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.expected-error":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.illegal-arg":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.unknown-error":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.errors":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" + "meters": { + "org.apache.hugegraph.api.API.commit-succeed": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.expected-error": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.unknown-error": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" } }, - "timers":{ - "org.apache.hugegraph.api.auth.AccessAPI.create":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.delete":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.get":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.list":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" + "timers": { + "org.apache.hugegraph.api.auth.AccessAPI.create": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.get": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.list": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" }, ... } @@ -460,7 +458,8 @@ http://localhost:8080/metrics/ ```json # HELP hugegraph_info # TYPE hugegraph_info untyped -hugegraph_info{version="0.69",} 1.0 +hugegraph_info{version="0.69", +} 1.0 # HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity # TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity gauge org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity 1000000 @@ -512,7 +511,7 @@ org_apache_hugegraph_backend_cache_Cache_schema_name_hugegraph_size 17 ... ``` -### 1.2 获取Gauges指标 +### 1.2 获取 Gauges 指标 ##### Method & Url @@ -531,175 +530,175 @@ http://localhost:8080/metrics/gauges ```json { - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { - "value": 1000000 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.instances": { - "value": 7 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { - "value": 10000 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { - "value": 17 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { - "value": 10000 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { - "value": 17 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { - "value": 10000000 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.server.RestServer.max-write-threads": { - "value": 0 - }, - "org.apache.hugegraph.task.TaskManager.pending-tasks": { - "value": 0 - }, - "org.apache.hugegraph.task.TaskManager.workers": { - "value": 4 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { - "value": 9.227692E8 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { - "value": 0.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { - "value": 0.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { - "value": 1.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { - "value": 1845538400 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { - "value": 0 - } + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 9.227692E8 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 + } } ``` -### 1.3 获取Counters指标 +### 1.3 获取 Counters 指标 ##### Method & Url @@ -775,7 +774,7 @@ GET http://localhost:8080/metrics/counters } ``` -### 1.4 获取histograms指标 +### 1.4 获取 histograms 指标 ##### Method & Url @@ -914,7 +913,7 @@ GET http://localhost:8080/metrics/gauges } ``` -### 1.5 获取meters指标 +### 1.5 获取 meters 指标 ##### Method & Url @@ -976,7 +975,7 @@ GET http://localhost:8080/metrics/meters } ``` -### 1.6 获取timers指标 +### 1.6 获取 timers 指标 ##### Method & Url @@ -1033,9 +1032,7 @@ GET http://localhost:8080/metrics/timers "m1_rate": 0.0, "rate_unit": "calls/second" }, - ... - } ``` @@ -1043,7 +1040,7 @@ GET http://localhost:8080/metrics/timers ##### Params -- type:如果传值为json,则以json格式返回,否则以Promethaus格式返回。 +- type:如果传值为 json,则以 json 格式返回,否则以 Promethaus 格式返回。 ##### 2.1 Method & Url @@ -1056,56 +1053,93 @@ GET http://localhost:8080/metrics/statistics ```json # HELP hugegraph_info # TYPE hugegraph_info untyped -hugegraph_info{version="0.69",} 1.0 +hugegraph_info{version="0.69", +} 1.0 # HELP metrics_POST # TYPE metrics_POST gauge metrics_POST{name=FAILED_REQUEST,} 1 metrics_POST{name=MEAN_RESPONSE_TIME,} 21.0 -metrics_POST{name=MAX_RESPONSE_TIME,} 21 -metrics_POST{name=SUCCESS_REQUEST,} 0 -metrics_POST{name=TOTAL_REQUEST,} 1 +metrics_POST{ +name=MAX_RESPONSE_TIME, +} 21 +metrics_POST{name=SUCCESS_REQUEST, +} 0 +metrics_POST{ +name=TOTAL_REQUEST, +} 1 # HELP metrics_backend_GET # TYPE metrics_backend_GET gauge -metrics_backend_GET{name=FAILED_REQUEST,} 0 -metrics_backend_GET{name=MEAN_RESPONSE_TIME,} 12.6852124529148 -metrics_backend_GET{name=MAX_RESPONSE_TIME,} 20 -metrics_backend_GET{name=SUCCESS_REQUEST,} 2 +metrics_backend_GET{name=FAILED_REQUEST, +} 0 +metrics_backend_GET{ +name=MEAN_RESPONSE_TIME, +} 12.6852124529148 +metrics_backend_GET{ +name=MAX_RESPONSE_TIME, +} 20 +metrics_backend_GET{ +name=SUCCESS_REQUEST, +} 2 metrics_backend_GET{name=TOTAL_REQUEST,} 2 # HELP system_GET # TYPE system_GET gauge system_GET{name=FAILED_REQUEST,} 1 system_GET{name=MEAN_RESPONSE_TIME,} 2.0 system_GET{name=MAX_RESPONSE_TIME,} 2 -system_GET{name=SUCCESS_REQUEST,} 0 -system_GET{name=TOTAL_REQUEST,} 1 +system_GET{ +name=SUCCESS_REQUEST, +} 0 +system_GET{name=TOTAL_REQUEST, +} 1 # HELP metrics_gauges_GET # TYPE metrics_gauges_GET gauge metrics_gauges_GET{name=FAILED_REQUEST,} 0 -metrics_gauges_GET{name=MEAN_RESPONSE_TIME,} 7.0 -metrics_gauges_GET{name=MAX_RESPONSE_TIME,} 7 -metrics_gauges_GET{name=SUCCESS_REQUEST,} 1 -metrics_gauges_GET{name=TOTAL_REQUEST,} 1 +metrics_gauges_GET{name=MEAN_RESPONSE_TIME, +} 7.0 +metrics_gauges_GET{ +name=MAX_RESPONSE_TIME, +} 7 +metrics_gauges_GET{ +name=SUCCESS_REQUEST, +} 1 +metrics_gauges_GET{ +name=TOTAL_REQUEST, +} 1 # HELP favicon.ico_GET # TYPE favicon.ico_GET gauge -favicon.ico_GET{name=FAILED_REQUEST,} 1 -favicon.ico_GET{name=MEAN_RESPONSE_TIME,} 1.0 +favicon.ico_GET{name=FAILED_REQUEST, +} 1 +favicon.ico_GET{ +name=MEAN_RESPONSE_TIME, +} 1.0 favicon.ico_GET{name=MAX_RESPONSE_TIME,} 1 favicon.ico_GET{name=SUCCESS_REQUEST,} 0 -favicon.ico_GET{name=TOTAL_REQUEST,} 1 +favicon.ico_GET{ +name=TOTAL_REQUEST, +} 1 # HELP metrics__GET # TYPE metrics__GET gauge metrics__GET{name=FAILED_REQUEST,} 0 metrics__GET{name=MEAN_RESPONSE_TIME,} 10.0 -metrics__GET{name=MAX_RESPONSE_TIME,} 10 -metrics__GET{name=SUCCESS_REQUEST,} 2 -metrics__GET{name=TOTAL_REQUEST,} 2 +metrics__GET{name=MAX_RESPONSE_TIME, +} 10 +metrics__GET{ +name=SUCCESS_REQUEST, +} 2 +metrics__GET{ +name=TOTAL_REQUEST, +} 2 # HELP metrics_system_GET # TYPE metrics_system_GET gauge metrics_system_GET{name=FAILED_REQUEST,} 0 -metrics_system_GET{name=MEAN_RESPONSE_TIME,} 8.942674506664073 -metrics_system_GET{name=MAX_RESPONSE_TIME,} 40 +metrics_system_GET{name=MEAN_RESPONSE_TIME, +} 8.942674506664073 +metrics_system_GET{ +name=MAX_RESPONSE_TIME, +} 40 metrics_system_GET{name=SUCCESS_REQUEST,} 2 -metrics_system_GET{name=TOTAL_REQUEST,} 2 +metrics_system_GET{name=TOTAL_REQUEST, +} 2 ``` @@ -1131,60 +1165,58 @@ GET http://localhost:8080/metrics/statistics?type=json ```json { - "metrics/POST":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":21, - "MAX_RESPONSE_TIME":21, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics/backend/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":12.6852124529148, - "MAX_RESPONSE_TIME":20, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - }, - "system/GET":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":2, - "MAX_RESPONSE_TIME":2, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics/gauges/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":7, - "MAX_RESPONSE_TIME":7, - "SUCCESS_REQUEST":1, - "TOTAL_REQUEST":1 - }, - "favicon.ico/GET":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":1, - "MAX_RESPONSE_TIME":1, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics//GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":10, - "MAX_RESPONSE_TIME":10, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - }, - "metrics/system/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":8.942674506664073, - "MAX_RESPONSE_TIME":40, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - } + "metrics/POST": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 21, + "MAX_RESPONSE_TIME": 21, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics/backend/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 12.6852124529148, + "MAX_RESPONSE_TIME": 20, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + }, + "system/GET": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 2, + "MAX_RESPONSE_TIME": 2, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics/gauges/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 7, + "MAX_RESPONSE_TIME": 7, + "SUCCESS_REQUEST": 1, + "TOTAL_REQUEST": 1 + }, + "favicon.ico/GET": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 1, + "MAX_RESPONSE_TIME": 1, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics//GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 10, + "MAX_RESPONSE_TIME": 10, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + }, + "metrics/system/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 8.942674506664073, + "MAX_RESPONSE_TIME": 40, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + } } ``` - - ## 3.系统指标 系统指标主要返回机器运行指标,如内存、线程等信息。 @@ -1205,54 +1237,52 @@ GET http://localhost:8080/metrics/system ```json { - "basic": { - "mem": 1010, - "mem_total": 911, - "mem_used": 239, - "mem_free": 671, - "mem_unit": "MB", - "processors": 20, - "uptime": 137503, - "systemload_average": -1.0 - }, - "heap": { - "committed": 911, - "init": 254, - "used": 239, - "max": 3596 - }, - "nonheap": { - "committed": 98, - "init": 2, - "used": 95, - "max": 0 - }, - "thread": { - "peak": 82, - "daemon": 34, - "total_started": 108, - "count": 82 - }, - "class_loading": { - "count": 11495, - "loaded": 11495, - "unloaded": 0 - }, - "garbage_collector": { - "ps_scavenge_count": 16, - "ps_scavenge_time": 155, - "ps_marksweep_count": 3, - "ps_marksweep_time": 494, - "time_unit": "ms" - } + "basic": { + "mem": 1010, + "mem_total": 911, + "mem_used": 239, + "mem_free": 671, + "mem_unit": "MB", + "processors": 20, + "uptime": 137503, + "systemload_average": -1.0 + }, + "heap": { + "committed": 911, + "init": 254, + "used": 239, + "max": 3596 + }, + "nonheap": { + "committed": 98, + "init": 2, + "used": 95, + "max": 0 + }, + "thread": { + "peak": 82, + "daemon": 34, + "total_started": 108, + "count": 82 + }, + "class_loading": { + "count": 11495, + "loaded": 11495, + "unloaded": 0 + }, + "garbage_collector": { + "ps_scavenge_count": 16, + "ps_scavenge_time": 155, + "ps_marksweep_count": 3, + "ps_marksweep_time": 494, + "time_unit": "ms" + } } ``` - - ## 4.后端指标 -hugeGraph支持多种后端存储,后端指标包括内存、磁盘等信息。 +hugeGraph 支持多种后端存储,后端指标包括内存、磁盘等信息。 ##### Method & Url diff --git a/content/en/docs/clients/restful-api/metrics.md b/content/en/docs/clients/restful-api/metrics.md index b1ae0aa77..e87a31369 100644 --- a/content/en/docs/clients/restful-api/metrics.md +++ b/content/en/docs/clients/restful-api/metrics.md @@ -5,17 +5,17 @@ weight: 1 --- -HugeGraph provides metrics info, including basic metrics, statistical metrics, system metrics, and backend metrics. - +HugeGraph provides metrics info, including basic metrics, statistical metrics, system metrics, and +backend metrics. ## 1. Basic Metrics ### 1.1 Get All Basic Metrics - ##### Params -- type:If the passed value is JSON, it is returned in JSON format, otherwise it is returned in Promethaus format. +- type: If the passed value is JSON, it is returned in JSON format, otherwise it is returned in + Promethaus format. ##### 1.1.1 Method & Url @@ -33,409 +33,409 @@ http://localhost:8080/metrics/?type=json ```json { - "gauges":{ - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity":{ - "value":1000000 + "gauges": { + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.instances":{ - "value":7 + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity":{ - "value":10000 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size":{ - "value":17 + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity":{ - "value":10000 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size":{ - "value":17 + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity":{ - "value":10240 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity":{ - "value":10000000 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire":{ - "value":600000 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size":{ - "value":0 + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 }, - "org.apache.hugegraph.server.RestServer.max-write-threads":{ - "value":0 + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 }, - "org.apache.hugegraph.task.TaskManager.pending-tasks":{ - "value":0 + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 }, - "org.apache.hugegraph.task.TaskManager.workers":{ - "value":4 + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty":{ - "value":922769200 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 922769200 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate":{ - "value":1 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count":{ - "value":2 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time":{ - "value":1845538400 + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions":{ - "value":0 + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 } }, - "counters":{ - "favicon.ico/GET/FAILED_COUNTER":{ - "count":1 + "counters": { + "favicon.ico/GET/FAILED_COUNTER": { + "count": 1 }, - "favicon.ico/GET/TOTAL_COUNTER":{ - "count":1 + "favicon.ico/GET/TOTAL_COUNTER": { + "count": 1 }, - "metrics/POST/FAILED_COUNTER":{ - "count":1 + "metrics/POST/FAILED_COUNTER": { + "count": 1 }, - "metrics/POST/TOTAL_COUNTER":{ - "count":1 + "metrics/POST/TOTAL_COUNTER": { + "count": 1 }, - "metrics/backend/GET/SUCCESS_COUNTER":{ - "count":2 + "metrics/backend/GET/SUCCESS_COUNTER": { + "count": 2 }, - "metrics/backend/GET/TOTAL_COUNTER":{ - "count":2 + "metrics/backend/GET/TOTAL_COUNTER": { + "count": 2 }, - "metrics/gauges/GET/SUCCESS_COUNTER":{ - "count":1 + "metrics/gauges/GET/SUCCESS_COUNTER": { + "count": 1 }, - "metrics/gauges/GET/TOTAL_COUNTER":{ - "count":1 + "metrics/gauges/GET/TOTAL_COUNTER": { + "count": 1 }, - "metrics/system/GET/SUCCESS_COUNTER":{ - "count":2 + "metrics/system/GET/SUCCESS_COUNTER": { + "count": 2 }, - "metrics/system/GET/TOTAL_COUNTER":{ - "count":2 + "metrics/system/GET/TOTAL_COUNTER": { + "count": 2 }, - "system/GET/FAILED_COUNTER":{ - "count":1 + "system/GET/FAILED_COUNTER": { + "count": 1 }, - "system/GET/TOTAL_COUNTER":{ - "count":1 + "system/GET/TOTAL_COUNTER": { + "count": 1 } }, - "histograms":{ - "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":1, - "mean":1, - "max":1, - "stddev":0, - "p50":1, - "p75":1, - "p95":1, - "p98":1, - "p99":1, - "p999":1 - }, - "metrics/POST/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":21, - "mean":21, - "max":21, - "stddev":0, - "p50":21, - "p75":21, - "p95":21, - "p98":21, - "p99":21, - "p999":21 - }, - "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":2, - "min":6, - "mean":12.6852124529148, - "max":20, - "stddev":6.992918475157571, - "p50":6, - "p75":20, - "p95":20, - "p98":20, - "p99":20, - "p999":20 - }, - "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":7, - "mean":7, - "max":7, - "stddev":0, - "p50":7, - "p75":7, - "p95":7, - "p98":7, - "p99":7, - "p999":7 - }, - "metrics/system/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":2, - "min":0, - "mean":8.942674506664073, - "max":40, - "stddev":16.665399873223066, - "p50":0, - "p75":0, - "p95":40, - "p98":40, - "p99":40, - "p999":40 - }, - "system/GET/RESPONSE_TIME_HISTOGRAM":{ - "count":1, - "min":2, - "mean":2, - "max":2, - "stddev":0, - "p50":2, - "p75":2, - "p95":2, - "p98":2, - "p99":2, - "p999":2 + "histograms": { + "favicon.ico/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 1, + "mean": 1, + "max": 1, + "stddev": 0, + "p50": 1, + "p75": 1, + "p95": 1, + "p98": 1, + "p99": 1, + "p999": 1 + }, + "metrics/POST/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 21, + "mean": 21, + "max": 21, + "stddev": 0, + "p50": 21, + "p75": 21, + "p95": 21, + "p98": 21, + "p99": 21, + "p999": 21 + }, + "metrics/backend/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 6, + "mean": 12.6852124529148, + "max": 20, + "stddev": 6.992918475157571, + "p50": 6, + "p75": 20, + "p95": 20, + "p98": 20, + "p99": 20, + "p999": 20 + }, + "metrics/gauges/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 7, + "mean": 7, + "max": 7, + "stddev": 0, + "p50": 7, + "p75": 7, + "p95": 7, + "p98": 7, + "p99": 7, + "p999": 7 + }, + "metrics/system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 2, + "min": 0, + "mean": 8.942674506664073, + "max": 40, + "stddev": 16.665399873223066, + "p50": 0, + "p75": 0, + "p95": 40, + "p98": 40, + "p99": 40, + "p999": 40 + }, + "system/GET/RESPONSE_TIME_HISTOGRAM": { + "count": 1, + "min": 2, + "mean": 2, + "max": 2, + "stddev": 0, + "p50": 2, + "p75": 2, + "p95": 2, + "p98": 2, + "p99": 2, + "p999": 2 } }, - "meters":{ - "org.apache.hugegraph.api.API.commit-succeed":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.expected-error":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.illegal-arg":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.hugegraph.api.API.unknown-error":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.errors":{ - "count":0, - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"events/second" + "meters": { + "org.apache.hugegraph.api.API.commit-succeed": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.expected-error": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.illegal-arg": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.hugegraph.api.API.unknown-error": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.errors": { + "count": 0, + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "events/second" } }, - "timers":{ - "org.apache.hugegraph.api.auth.AccessAPI.create":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.delete":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.get":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" - }, - "org.apache.hugegraph.api.auth.AccessAPI.list":{ - "count":0, - "min":0, - "mean":0, - "max":0, - "stddev":0, - "p50":0, - "p75":0, - "p95":0, - "p98":0, - "p99":0, - "p999":0, - "duration_unit":"milliseconds", - "mean_rate":0, - "m15_rate":0, - "m5_rate":0, - "m1_rate":0, - "rate_unit":"calls/second" + "timers": { + "org.apache.hugegraph.api.auth.AccessAPI.create": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.delete": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.get": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" + }, + "org.apache.hugegraph.api.auth.AccessAPI.list": { + "count": 0, + "min": 0, + "mean": 0, + "max": 0, + "stddev": 0, + "p50": 0, + "p75": 0, + "p95": 0, + "p98": 0, + "p99": 0, + "p999": 0, + "duration_unit": "milliseconds", + "mean_rate": 0, + "m15_rate": 0, + "m5_rate": 0, + "m1_rate": 0, + "rate_unit": "calls/second" }, ... } @@ -460,7 +460,8 @@ http://localhost:8080/metrics/ ```json # HELP hugegraph_info # TYPE hugegraph_info untyped -hugegraph_info{version="0.69",} 1.0 +hugegraph_info{version="0.69", +} 1.0 # HELP org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity # TYPE org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity gauge org_apache_hugegraph_backend_cache_Cache_edge_hugegraph_capacity 1000000 @@ -531,171 +532,171 @@ http://localhost:8080/metrics/gauges ```json { - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { - "value": 1000000 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.instances": { - "value": 7 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { - "value": 10000 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { - "value": 17 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { - "value": 10000 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { - "value": 17 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { - "value": 10240 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { - "value": 10000000 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { - "value": 600000 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { - "value": 0 - }, - "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { - "value": 0 - }, - "org.apache.hugegraph.server.RestServer.max-write-threads": { - "value": 0 - }, - "org.apache.hugegraph.task.TaskManager.pending-tasks": { - "value": 0 - }, - "org.apache.hugegraph.task.TaskManager.workers": { - "value": 4 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { - "value": 9.227692E8 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { - "value": 0.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { - "value": 0.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { - "value": 0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { - "value": 1.0 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { - "value": 2 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { - "value": 1845538400 - }, - "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { - "value": 0 - } + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.capacity": { + "value": 1000000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.edge-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.instances": { + "value": 7 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-id-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.capacity": { + "value": 10000 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.expire": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.schema-name-hugegraph.size": { + "value": 17 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.token-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.capacity": { + "value": 10240 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.users_pwd-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.capacity": { + "value": 10000000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.expire": { + "value": 600000 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.hits": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.miss": { + "value": 0 + }, + "org.apache.hugegraph.backend.cache.Cache.vertex-hugegraph.size": { + "value": 0 + }, + "org.apache.hugegraph.server.RestServer.max-write-threads": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.pending-tasks": { + "value": 0 + }, + "org.apache.hugegraph.task.TaskManager.workers": { + "value": 4 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.average-load-penalty": { + "value": 9.227692E8 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.estimated-size": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.eviction-weight": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.hit-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-failure-rate": { + "value": 0.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.load-success-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.long-run-compilation-count": { + "value": 0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.miss-rate": { + "value": 1.0 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.request-count": { + "value": 2 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.gremlin-groovy.sessionless.class-cache.total-load-time": { + "value": 1845538400 + }, + "org.apache.tinkerpop.gremlin.server.GremlinServer.sessions": { + "value": 0 + } } ``` @@ -1033,9 +1034,7 @@ GET http://localhost:8080/metrics/timers "m1_rate": 0.0, "rate_unit": "calls/second" }, - ... - } ``` @@ -1043,8 +1042,8 @@ GET http://localhost:8080/metrics/timers ##### Params -- type:If the passed value is JSON, it is returned in JSON format, otherwise it is returned in -Promethaus format. +- type: If the passed value is JSON, it is returned in JSON format, otherwise it is returned in + Promethaus format. ##### 2.1 Method & Url @@ -1057,56 +1056,93 @@ GET http://localhost:8080/metrics/statistics ```json # HELP hugegraph_info # TYPE hugegraph_info untyped -hugegraph_info{version="0.69",} 1.0 +hugegraph_info{version="0.69", +} 1.0 # HELP metrics_POST # TYPE metrics_POST gauge metrics_POST{name=FAILED_REQUEST,} 1 metrics_POST{name=MEAN_RESPONSE_TIME,} 21.0 -metrics_POST{name=MAX_RESPONSE_TIME,} 21 -metrics_POST{name=SUCCESS_REQUEST,} 0 -metrics_POST{name=TOTAL_REQUEST,} 1 +metrics_POST{ +name=MAX_RESPONSE_TIME, +} 21 +metrics_POST{name=SUCCESS_REQUEST, +} 0 +metrics_POST{ +name=TOTAL_REQUEST, +} 1 # HELP metrics_backend_GET # TYPE metrics_backend_GET gauge -metrics_backend_GET{name=FAILED_REQUEST,} 0 -metrics_backend_GET{name=MEAN_RESPONSE_TIME,} 12.6852124529148 -metrics_backend_GET{name=MAX_RESPONSE_TIME,} 20 -metrics_backend_GET{name=SUCCESS_REQUEST,} 2 +metrics_backend_GET{name=FAILED_REQUEST, +} 0 +metrics_backend_GET{ +name=MEAN_RESPONSE_TIME, +} 12.6852124529148 +metrics_backend_GET{ +name=MAX_RESPONSE_TIME, +} 20 +metrics_backend_GET{ +name=SUCCESS_REQUEST, +} 2 metrics_backend_GET{name=TOTAL_REQUEST,} 2 # HELP system_GET # TYPE system_GET gauge system_GET{name=FAILED_REQUEST,} 1 system_GET{name=MEAN_RESPONSE_TIME,} 2.0 system_GET{name=MAX_RESPONSE_TIME,} 2 -system_GET{name=SUCCESS_REQUEST,} 0 -system_GET{name=TOTAL_REQUEST,} 1 +system_GET{ +name=SUCCESS_REQUEST, +} 0 +system_GET{name=TOTAL_REQUEST, +} 1 # HELP metrics_gauges_GET # TYPE metrics_gauges_GET gauge metrics_gauges_GET{name=FAILED_REQUEST,} 0 -metrics_gauges_GET{name=MEAN_RESPONSE_TIME,} 7.0 -metrics_gauges_GET{name=MAX_RESPONSE_TIME,} 7 -metrics_gauges_GET{name=SUCCESS_REQUEST,} 1 -metrics_gauges_GET{name=TOTAL_REQUEST,} 1 +metrics_gauges_GET{name=MEAN_RESPONSE_TIME, +} 7.0 +metrics_gauges_GET{ +name=MAX_RESPONSE_TIME, +} 7 +metrics_gauges_GET{ +name=SUCCESS_REQUEST, +} 1 +metrics_gauges_GET{ +name=TOTAL_REQUEST, +} 1 # HELP favicon.ico_GET # TYPE favicon.ico_GET gauge -favicon.ico_GET{name=FAILED_REQUEST,} 1 -favicon.ico_GET{name=MEAN_RESPONSE_TIME,} 1.0 +favicon.ico_GET{name=FAILED_REQUEST, +} 1 +favicon.ico_GET{ +name=MEAN_RESPONSE_TIME, +} 1.0 favicon.ico_GET{name=MAX_RESPONSE_TIME,} 1 favicon.ico_GET{name=SUCCESS_REQUEST,} 0 -favicon.ico_GET{name=TOTAL_REQUEST,} 1 +favicon.ico_GET{ +name=TOTAL_REQUEST, +} 1 # HELP metrics__GET # TYPE metrics__GET gauge metrics__GET{name=FAILED_REQUEST,} 0 metrics__GET{name=MEAN_RESPONSE_TIME,} 10.0 -metrics__GET{name=MAX_RESPONSE_TIME,} 10 -metrics__GET{name=SUCCESS_REQUEST,} 2 -metrics__GET{name=TOTAL_REQUEST,} 2 +metrics__GET{name=MAX_RESPONSE_TIME, +} 10 +metrics__GET{ +name=SUCCESS_REQUEST, +} 2 +metrics__GET{ +name=TOTAL_REQUEST, +} 2 # HELP metrics_system_GET # TYPE metrics_system_GET gauge metrics_system_GET{name=FAILED_REQUEST,} 0 -metrics_system_GET{name=MEAN_RESPONSE_TIME,} 8.942674506664073 -metrics_system_GET{name=MAX_RESPONSE_TIME,} 40 +metrics_system_GET{name=MEAN_RESPONSE_TIME, +} 8.942674506664073 +metrics_system_GET{ +name=MAX_RESPONSE_TIME, +} 40 metrics_system_GET{name=SUCCESS_REQUEST,} 2 -metrics_system_GET{name=TOTAL_REQUEST,} 2 +metrics_system_GET{name=TOTAL_REQUEST, +} 2 ``` @@ -1132,64 +1168,61 @@ GET http://localhost:8080/metrics/statistics?type=json ```json { - "metrics/POST":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":21, - "MAX_RESPONSE_TIME":21, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics/backend/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":12.6852124529148, - "MAX_RESPONSE_TIME":20, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - }, - "system/GET":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":2, - "MAX_RESPONSE_TIME":2, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics/gauges/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":7, - "MAX_RESPONSE_TIME":7, - "SUCCESS_REQUEST":1, - "TOTAL_REQUEST":1 - }, - "favicon.ico/GET":{ - "FAILED_REQUEST":1, - "MEAN_RESPONSE_TIME":1, - "MAX_RESPONSE_TIME":1, - "SUCCESS_REQUEST":0, - "TOTAL_REQUEST":1 - }, - "metrics//GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":10, - "MAX_RESPONSE_TIME":10, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - }, - "metrics/system/GET":{ - "FAILED_REQUEST":0, - "MEAN_RESPONSE_TIME":8.942674506664073, - "MAX_RESPONSE_TIME":40, - "SUCCESS_REQUEST":2, - "TOTAL_REQUEST":2 - } + "metrics/POST": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 21, + "MAX_RESPONSE_TIME": 21, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics/backend/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 12.6852124529148, + "MAX_RESPONSE_TIME": 20, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + }, + "system/GET": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 2, + "MAX_RESPONSE_TIME": 2, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics/gauges/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 7, + "MAX_RESPONSE_TIME": 7, + "SUCCESS_REQUEST": 1, + "TOTAL_REQUEST": 1 + }, + "favicon.ico/GET": { + "FAILED_REQUEST": 1, + "MEAN_RESPONSE_TIME": 1, + "MAX_RESPONSE_TIME": 1, + "SUCCESS_REQUEST": 0, + "TOTAL_REQUEST": 1 + }, + "metrics//GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 10, + "MAX_RESPONSE_TIME": 10, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + }, + "metrics/system/GET": { + "FAILED_REQUEST": 0, + "MEAN_RESPONSE_TIME": 8.942674506664073, + "MAX_RESPONSE_TIME": 40, + "SUCCESS_REQUEST": 2, + "TOTAL_REQUEST": 2 + } } ``` - - ## 3.System Metrics -System metrics mainly return the machine metrics, such as memory, threads, and other -information. +System metrics mainly return the machine metrics, such as memory, threads, and other information. ##### Method & Url @@ -1207,54 +1240,54 @@ GET http://localhost:8080/metrics/system ```json { - "basic": { - "mem": 1010, - "mem_total": 911, - "mem_used": 239, - "mem_free": 671, - "mem_unit": "MB", - "processors": 20, - "uptime": 137503, - "systemload_average": -1.0 - }, - "heap": { - "committed": 911, - "init": 254, - "used": 239, - "max": 3596 - }, - "nonheap": { - "committed": 98, - "init": 2, - "used": 95, - "max": 0 - }, - "thread": { - "peak": 82, - "daemon": 34, - "total_started": 108, - "count": 82 - }, - "class_loading": { - "count": 11495, - "loaded": 11495, - "unloaded": 0 - }, - "garbage_collector": { - "ps_scavenge_count": 16, - "ps_scavenge_time": 155, - "ps_marksweep_count": 3, - "ps_marksweep_time": 494, - "time_unit": "ms" - } + "basic": { + "mem": 1010, + "mem_total": 911, + "mem_used": 239, + "mem_free": 671, + "mem_unit": "MB", + "processors": 20, + "uptime": 137503, + "systemload_average": -1.0 + }, + "heap": { + "committed": 911, + "init": 254, + "used": 239, + "max": 3596 + }, + "nonheap": { + "committed": 98, + "init": 2, + "used": 95, + "max": 0 + }, + "thread": { + "peak": 82, + "daemon": 34, + "total_started": 108, + "count": 82 + }, + "class_loading": { + "count": 11495, + "loaded": 11495, + "unloaded": 0 + }, + "garbage_collector": { + "ps_scavenge_count": 16, + "ps_scavenge_time": 155, + "ps_marksweep_count": 3, + "ps_marksweep_time": 494, + "time_unit": "ms" + } } ``` - - ## 4.Backend Metrics -HugeGraph supports multiple backend storage, with backend metrics including memory, disk, and other information. +HugeGraph supports multiple backend storage, with backend metrics including memory, disk, and other +information. + ##### Method & Url ``` From 77b8e3144c0e4b329fd0ba9d5b0c79eee5779370 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Sun, 5 Nov 2023 12:19:46 +0800 Subject: [PATCH 03/19] =?UTF-8?q?feat(website):=20add=20metric=20api=20doc?= =?UTF-8?q?=EF=BC=8Cformat=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/cn/docs/clients/restful-api/metrics.md | 5 +++-- content/en/docs/clients/restful-api/metrics.md | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/content/cn/docs/clients/restful-api/metrics.md b/content/cn/docs/clients/restful-api/metrics.md index b523a6689..0a65e6162 100644 --- a/content/cn/docs/clients/restful-api/metrics.md +++ b/content/cn/docs/clients/restful-api/metrics.md @@ -5,7 +5,8 @@ weight: 1 --- -HugeGraph 提供关于 Metrics 的信息披露,包括:基础指标、统计指标、系统指标、后端指标。 +HugeGraph 提供了获取监控信息的 Metrics 接口,比如各个 Gremlin 执行时间的统计、缓存的占用大小等。Metrics +接口包括如下几类:基础指标、统计指标、系统指标、后端存储指标。 ## 1. 基础指标 @@ -13,7 +14,7 @@ HugeGraph 提供关于 Metrics 的信息披露,包括:基础指标、统计 ##### Params -- type:如果传值为 json,则以 json 格式返回,否则以 Promethaus 格式返回。 +- type:如果传值为`json`,则以 json 格式返回,否则以 Promethaus 格式返回。 ##### 1.1.1 Method & Url diff --git a/content/en/docs/clients/restful-api/metrics.md b/content/en/docs/clients/restful-api/metrics.md index e87a31369..96c0d7021 100644 --- a/content/en/docs/clients/restful-api/metrics.md +++ b/content/en/docs/clients/restful-api/metrics.md @@ -5,8 +5,10 @@ weight: 1 --- -HugeGraph provides metrics info, including basic metrics, statistical metrics, system metrics, and -backend metrics. + +HugeGraph provides a metrics interface for obtaining monitoring information, such as statistics on +each Gremlin execution time, cache size, etc. The metrics interface includes the following +categories: basic metrics, statistical metrics, system metrics, and back-end storage metrics. ## 1. Basic Metrics @@ -14,7 +16,7 @@ backend metrics. ##### Params -- type: If the passed value is JSON, it is returned in JSON format, otherwise it is returned in +- type: If the passed value is `JSON`, it is returned in JSON format, otherwise it is returned in Promethaus format. ##### 1.1.1 Method & Url From 27cf698300af73cb855ff0dbf46aba877ee67d79 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Mon, 6 Nov 2023 21:23:02 +0800 Subject: [PATCH 04/19] =?UTF-8?q?feat(website):=20add=20metric=20api=20doc?= =?UTF-8?q?=EF=BC=8Cformat=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/en/docs/clients/restful-api/metrics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/clients/restful-api/metrics.md b/content/en/docs/clients/restful-api/metrics.md index 96c0d7021..a92cb35d0 100644 --- a/content/en/docs/clients/restful-api/metrics.md +++ b/content/en/docs/clients/restful-api/metrics.md @@ -8,7 +8,7 @@ weight: 1 HugeGraph provides a metrics interface for obtaining monitoring information, such as statistics on each Gremlin execution time, cache size, etc. The metrics interface includes the following -categories: basic metrics, statistical metrics, system metrics, and back-end storage metrics. +categories: basic metrics, statistical metrics, system metrics, and backend storage metrics. ## 1. Basic Metrics @@ -16,7 +16,7 @@ categories: basic metrics, statistical metrics, system metrics, and back-end sto ##### Params -- type: If the passed value is `JSON`, it is returned in JSON format, otherwise it is returned in +- type: If the passed value is `json`, it is returned in json format, otherwise it is returned in Promethaus format. ##### 1.1.1 Method & Url From f1159fc2332525986ff3b4703b336dd217e427a1 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Mon, 6 Nov 2023 23:41:34 +0800 Subject: [PATCH 05/19] =?UTF-8?q?feat(website):=20add=20metric=20api=20doc?= =?UTF-8?q?=EF=BC=8Cformat=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/cn/docs/clients/restful-api/metrics.md | 4 ++-- content/en/docs/clients/restful-api/metrics.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/cn/docs/clients/restful-api/metrics.md b/content/cn/docs/clients/restful-api/metrics.md index 0a65e6162..f4cf772b5 100644 --- a/content/cn/docs/clients/restful-api/metrics.md +++ b/content/cn/docs/clients/restful-api/metrics.md @@ -456,7 +456,7 @@ http://localhost:8080/metrics/ ##### Response Body -```json +```text # HELP hugegraph_info # TYPE hugegraph_info untyped hugegraph_info{version="0.69", @@ -1051,7 +1051,7 @@ GET http://localhost:8080/metrics/statistics ##### Response Status -```json +```text # HELP hugegraph_info # TYPE hugegraph_info untyped hugegraph_info{version="0.69", diff --git a/content/en/docs/clients/restful-api/metrics.md b/content/en/docs/clients/restful-api/metrics.md index a92cb35d0..cd67890d3 100644 --- a/content/en/docs/clients/restful-api/metrics.md +++ b/content/en/docs/clients/restful-api/metrics.md @@ -459,7 +459,7 @@ http://localhost:8080/metrics/ ##### Response Body -```json +```text # HELP hugegraph_info # TYPE hugegraph_info untyped hugegraph_info{version="0.69", @@ -1055,7 +1055,7 @@ GET http://localhost:8080/metrics/statistics ##### Response Status -```json +```text # HELP hugegraph_info # TYPE hugegraph_info untyped hugegraph_info{version="0.69", From 1ed62cbbb1a08ee2ca00b27b1a4f38df8ba74b7a Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Fri, 24 Nov 2023 00:08:15 +0800 Subject: [PATCH 06/19] chore(website): remove config auth model doc --- .../cn/docs/config/config-authentication.md | 42 +++---------------- .../en/docs/config/config-authentication.md | 42 ++++--------------- 2 files changed, 14 insertions(+), 70 deletions(-) diff --git a/content/cn/docs/config/config-authentication.md b/content/cn/docs/config/config-authentication.md index 5c07301be..ba5e0839a 100644 --- a/content/cn/docs/config/config-authentication.md +++ b/content/cn/docs/config/config-authentication.md @@ -5,11 +5,9 @@ weight: 3 --- ### 概述 -HugeGraph 为了方便不同用户场景下的鉴权使用,目前内置了两套权限模式: -1. 简单的`ConfigAuthenticator`模式,通过本地配置文件存储用户名和密码 (仅支持单 GraphServer) -2. 完备的`StandardAuthenticator`模式,支持多用户认证、以及细粒度的权限访问控制,采用基于“用户 - 用户组 - 操作 - 资源”的 4 层设计,灵活控制用户角色与权限 (支持多 GraphServer) +HugeGraph 为了方便不同用户场景下的鉴权使用,目前内置了完备的`StandardAuthenticator`权限模式,支持多用户认证、以及细粒度的权限访问控制,采用基于“用户 - 用户组 - 操作 - 资源”的 4 层设计,灵活控制用户角色与权限 (支持多 GraphServer) -其中 `StandardAuthenticator` 模式的几个核心设计: +`StandardAuthenticator` 模式的几个核心设计: - 初始化时创建超级管理员 (`admin`) 用户,后续通过超级管理员创建其它用户,新创建的用户被分配足够权限后,可以创建或管理更多的用户 - 支持动态创建用户、用户组、资源,支持动态分配或取消权限 - 用户可以属于一个或多个用户组,每个用户组可以拥有对任意个资源的操作权限,操作类型包括:读、写、删除、执行等种类 @@ -24,9 +22,9 @@ user(name=xx) -belong-> group(name=xx) -access(read)-> target(graph=graph1, reso ### 配置用户认证 -HugeGraph 默认**不启用**用户认证功能,需通过修改配置文件来启用该功能。内置实现了`StandardAuthenticator`和`ConfigAuthenticator`两种模式,`StandardAuthenticator`模式支持多用户认证与细粒度权限控制,`ConfigAuthenticator`模式支持简单的用户权限认证。此外,开发者可以自定义实现`HugeAuthenticator`接口来对接自身的权限系统。 +HugeGraph 默认**不启用**用户认证功能,需通过修改配置文件来启用该功能。内置实现了`StandardAuthenticator`模式,该模式支持多用户认证与细粒度权限控制。此外,开发者可以自定义实现`HugeAuthenticator`接口来对接自身的权限系统。 -用户认证方式均采用 [HTTP Basic Authentication](https://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%81) ,简单说就是在发送 HTTP 请求时在 `Authentication` 设置选择 `Basic` 然后输入对应的用户名和密码,对应 HTTP 明文如下所示 : +用户认证方式均采用 [HTTP Basic Authentication](https://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%81) ,简单说就是在发送 HTTP 请求时在 `Authentication`设置选择 `Basic` 然后输入对应的用户名和密码,对应 HTTP 明文如下所示 : ```http GET http://localhost:8080/graphs/hugegraph/schema/vertexlabels @@ -53,7 +51,7 @@ auth.authenticator=org.apache.hugegraph.auth.StandardAuthenticator auth.graph_store=hugegraph # auth client config -# 如果是分开部署 GraphServer 和 AuthServer, 还需要指定下面的配置,地址填写 AuthServer 的 IP:RPC 端口 +# 如果是分开部署 GraphServer 和 AuthServer,还需要指定下面的配置,地址填写 AuthServer 的 IP:RPC 端口 #auth.remote_url=127.0.0.1:8899,127.0.0.1:8898,127.0.0.1:8897 ``` 其中,`graph_store`配置项是指使用哪一个图来存储用户信息,如果存在多个图的话,选取任意一个均可。 @@ -64,35 +62,7 @@ auth.graph_store=hugegraph gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy ``` -然后详细的权限 API 调用和说明请参考 [Authentication-API](/docs/clients/restful-api/auth) 文档 - -#### ConfigAuthenticator 模式 - -`ConfigAuthenticator`模式是通过预先在配置文件中设置用户信息来支持用户认证,该实现是基于配置好的静态`tokens`来验证用户是否合法。下面是具体的配置流程(重启服务生效): - -在配置文件`gremlin-server.yaml`中配置`authenticator`及其`rest-server`文件路径: - -```yaml -authentication: { - authenticator: org.apache.hugegraph.auth.ConfigAuthenticator, - authenticationHandler: org.apache.hugegraph.auth.WsAndHttpBasicAuthHandler, - config: {tokens: conf/rest-server.properties} -} -``` - -在配置文件`rest-server.properties`中配置`authenticator`及其`tokens`信息: - -```properties -auth.authenticator=org.apache.hugegraph.auth.ConfigAuthenticator -auth.admin_token=token-value-a -auth.user_tokens=[hugegraph1:token-value-1, hugegraph2:token-value-2] -``` - -在配置文件`hugegraph{n}.properties`中配置`gremlin.graph`信息: - -```properties -gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy -``` +然后详细的权限 API 调用和说明请参考 [Authentication-API](/docs/clients/restful-api/auth) 文档。 ### 自定义用户认证系统 diff --git a/content/en/docs/config/config-authentication.md b/content/en/docs/config/config-authentication.md index a91579143..3dbf046d7 100644 --- a/content/en/docs/config/config-authentication.md +++ b/content/en/docs/config/config-authentication.md @@ -5,9 +5,9 @@ weight: 3 --- ### Overview -To facilitate authentication usage in different user scenarios, HugeGraph currently provides two built-in authorization modes: -1. Simple `ConfigAuthenticator` mode, which stores usernames and passwords in a local configuration file (supports only a single GraphServer). -2. Comprehensive `StandardAuthenticator` mode, which supports multi-user authentication and fine-grained access control. It adopts a 4-layer design based on "User-UserGroup-Operation-Resource" to flexibly control user roles and permissions (supports multiple GraphServers). +To facilitate authentication usage in different user scenarios, HugeGraph currently provides built-in authorization `StandardAuthenticator` mode, +which supports multi-user authentication and fine-grained access control. It adopts a 4-layer design based on "User-UserGroup-Operation-Resource" to +flexibly control user roles and permissions (supports multiple GraphServers). Some key designs of the `StandardAuthenticator` mode include: - During initialization, a super administrator (`admin`) user is created. Subsequently, other users can be created by the super administrator. Once newly created users are assigned sufficient permissions, they can create or manage more users. @@ -24,9 +24,9 @@ user(name=xx) -belong-> group(name=xx) -access(read)-> target(graph=graph1, reso ### Configure User Authentication -By default, HugeGraph does **not enable** user authentication. You need to modify the configuration file to enable this feature. HugeGraph provides two built-in authentication modes: `StandardAuthenticator` and `ConfigAuthenticator`. The `StandardAuthenticator` mode supports multi-user authentication and fine-grained permission control, while the `ConfigAuthenticator` mode supports simple user permission authentication. Additionally, developers can implement their own `HugeAuthenticator` interface to integrate with their existing authentication systems. +By default, HugeGraph does **not enable** user authentication. You need to modify the configuration file to enable this feature. HugeGraph provides built-in authentication mode: `StandardAuthenticator`. This mode supports multi-user authentication and fine-grained permission control. Additionally, developers can implement their own `HugeAuthenticator` interface to integrate with their existing authentication systems. -Both authentication modes adopt [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). In simple terms, when sending an HTTP request, you need to set the `Authentication` header to `Basic` and provide the corresponding username and password. The corresponding HTTP plaintext format is as follows: +HugeGraph authentication modes adopt [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication). In simple terms, when sending an HTTP request, you need to set the `Authentication` header to `Basic` and provide the corresponding username and password. The corresponding HTTP plaintext format is as follows: ```http GET http://localhost:8080/graphs/hugegraph/schema/vertexlabels @@ -34,7 +34,9 @@ Authorization: Basic admin xxxx ``` #### StandardAuthenticator Mode -The `StandardAuthenticator` mode supports user authentication and permission control by storing user information in the database backend. This implementation authenticates users based on their names and passwords (encrypted) stored in the database and controls user permissions based on their roles. Below is the specific configuration process (requires service restart): +The `StandardAuthenticator` mode supports user authentication and permission control by storing user information in the database backend. This +implementation authenticates users based on their names and passwords (encrypted) stored in the database and controls user permissions based on their +roles. Below is the specific configuration process (requires service restart): Configure the `authenticator` and its `rest-server` file path in the `gremlin-server.yaml` configuration file: @@ -67,34 +69,6 @@ gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy For detailed API calls and explanations regarding permissions, please refer to the [Authentication-API](/docs/clients/restful-api/auth) documentation. -#### ConfigAuthenticator Mode - -The `ConfigAuthenticator` mode supports user authentication by predefining user information in the configuration file. This implementation verifies the legitimacy of users based on preconfigured static `tokens`. Below is the specific configuration process (requires service restart): - -Configure the `authenticator` and its `rest-server` file path in the `gremlin-server.yaml` configuration file: - -```yaml -authentication: { - authenticator: org.apache.hugegraph.auth.ConfigAuthenticator, - authenticationHandler: org.apache.hugegraph.auth.WsAndHttpBasicAuthHandler, - config: {tokens: conf/rest-server.properties} -} -``` - -Configure the `authenticator` and its `tokens` information in the `rest-server.properties` configuration file: - -```properties -auth.authenticator=org.apache.hugegraph.auth.ConfigAuthenticator -auth.admin_token=token-value-a -auth.user_tokens=[hugegraph1:token-value-1, hugegraph2:token-value-2] -``` - -In the `hugegraph{n}.properties` configuration file, configure the `gremlin.graph` information: - -```properties -gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy -``` - ### Custom User Authentication System If you need to support a more flexible user system, you can customize the authenticator for extension. From 6dc7eeada421d6c43d9cba923c3a9818c8276a20 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Fri, 24 Nov 2023 00:15:43 +0800 Subject: [PATCH 07/19] chore(website): remove config auth model doc --- content/cn/docs/config/config-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/cn/docs/config/config-authentication.md b/content/cn/docs/config/config-authentication.md index ba5e0839a..4e41447ba 100644 --- a/content/cn/docs/config/config-authentication.md +++ b/content/cn/docs/config/config-authentication.md @@ -24,7 +24,7 @@ user(name=xx) -belong-> group(name=xx) -access(read)-> target(graph=graph1, reso HugeGraph 默认**不启用**用户认证功能,需通过修改配置文件来启用该功能。内置实现了`StandardAuthenticator`模式,该模式支持多用户认证与细粒度权限控制。此外,开发者可以自定义实现`HugeAuthenticator`接口来对接自身的权限系统。 -用户认证方式均采用 [HTTP Basic Authentication](https://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%81) ,简单说就是在发送 HTTP 请求时在 `Authentication`设置选择 `Basic` 然后输入对应的用户名和密码,对应 HTTP 明文如下所示 : +用户认证方式均采用 [HTTP Basic Authentication](https://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%81) ,简单说就是在发送 HTTP 请求时在 `Authentication` 设置选择 `Basic` 然后输入对应的用户名和密码,对应 HTTP 明文如下所示 : ```http GET http://localhost:8080/graphs/hugegraph/schema/vertexlabels From 4df6f8d63efff59c3d052a82a693916300cea67c Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Wed, 29 Nov 2023 23:18:31 +0800 Subject: [PATCH 08/19] chore(website): add swagger ui auth doc --- ...15\347\275\256\347\244\272\344\276\213.jpg" | Bin 0 -> 62142 bytes ...64\346\235\203\347\244\272\344\276\213.png" | Bin 0 -> 144877 bytes content/cn/docs/quickstart/hugegraph-server.md | 12 ++++++++++++ content/en/docs/quickstart/hugegraph-server.md | 12 ++++++++++++ 4 files changed, 24 insertions(+) create mode 100644 "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" create mode 100644 "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" diff --git "a/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" "b/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1e13bf72bbf56ad6c0589e3e57853d0840f36706 GIT binary patch literal 62142 zcmeFZcT|(v`ZkQm8Fdat$3ia_ij9DDDM3e3k)|M`(nOllLa3o6(Lq2&hyogr5~T`? zASj(g2@t7~8X!Onp-2s(C6M+$L7n%s_xtPne(QVJI?tL}lH|#L_P+MruKT`s;x1X9 z7yY~R--U#PL`^T8wH6ZEfff?_#c;W*%D}d{tuzIowC!wi(foXTbvdW zdWRC`xcmyd{>}fw^*|vZaV5e3TTHDL7lnkDY)sFdz5;Wa8)2gz+%vx+k$Si+euJ?K zBCvY0E#N@Tp{N}iJ6^qbkofWT*?Wh+p5FEQ{T&AneEjVo>6Ef%)egPk2BqD<-T&pn zt-HHEXIfqeG`-L;zrJQuI8yITDi5^{rq3)~tRMBR@0Y6eq7MakT%TPpWqN`+i+Es0 z->)MvW|XWDkH7C)|M%@pDE^DdcZvAFTOe+V57xOyz~)*esQuB*m}4c?Cmn(Y z>-;~JAdHVSxyBPDQQGo>hHJfnGqJ@v#OMNNoZ|5tT!;%#6C-K|UdQ3xQT&qY2jtBR z^I<*=N!q*otgQlIKE61AGv*XRvHq|Cf7i#2Q(w)M zzdz!H;1QbRgHz7tVji*=#{$ibm`-)2>wKl{+S{&2S{6>+BhTBV%*C2CpY1&v_1or$ zJ467(_EBpH04#uYOR{k)E8N1mA`y(1ZPwe{H1#}ORB)S+hcI4A$h>vC!kqA-L$wWw zmFJSqQNmQJ<=S&uX>eAT3Z9NYy0UoFQ!zALSUBE_$hECv5fF=#C$gw z4?7_;7HCzkd}MRwyJ(m8V!UUxH=mKJ3d}|Q$SjZH#agn%$$>)$x=hiIC)BFt%qzEU z7rU?RO^Ve-F2ygdtH~yF>O4H!ruvz)Up@q^4vl{?(VbL@%Se0 zphJ8DS3d|hY~5)jp5@5+gN7TY;P|HkoL6F-=x5sAR)*?g&4eXJ(m7ZY<}j1g3=dft z?vot2Fz;Crhf~r$US-5trV^Bm3ru3nzE#TbV4(qDvs>%fS7TRe*J9&F#fT~kc9ZLl z9UV!*l_k|E9}zmTcUY045`m97?`P>}qm12FNK&TvPZ?umKk9uer(%oM?sG9Zr~_R* zqtN@Y=z&BrH++h zQzCGFLLYr@R^7+O2|E}5`tC3&wJEy1H)P~N)GriP|8xudyk}Uhz=50;WHx7KOn}05$GO=x zZ5Ku3Yh|Gj82{8VKM}6AI}5Ax&M}&GBiAYC_UyO77HWJHSVo@w!6pOxiRYoMtGv3EuY}jAXwGe`9ILfx6nK=xQ7FbMp%Ua}LF?aWU5lOAuEoo3yV|g& zu7T^j%pw;GNt@pMX1)~YC8S8)LKOYD5>BwEKBPEOB*jeYG09ZTFG#$hgZ0Wp4z^Fv zpxJ<4mmXQC5v*{&x5K~1{*Zx;Fh5yp?C4P}vHVWe_(Bsiv`)mb%V&MKbCOPSHA4rl z)--QP(R+|IbiOiQ-@$q>iXCgLuU1#OG4Xbr^Nc(w3^2JZr{k?(kNSxz?wxh78ZRt8 zkbVz_biI~RXZ7K{4t#j{^bQ5zFr9W^4);kZk2|SA7^+_*`jTzqN=#<7A7&xAN#kEl zwD=$TPoq$4#(SAiix8jcqiW@CiHqhN1=Kvqw|O;dinoC?d0gwGRkd2>a9j39Vi8gXIO# z-x6Wl?)S3w_JOx@J*#p@o)9v2KjU-P$6fPRXnOjhXhYmmlm7~|K)EvW(HPs%KE|xZ zsP^0@Nd0sY7S5LT++r$cb6Ix$LDbu~cQN>^~C*e8?z4Y{#qA;qS{qb-^)J*?{&*J4(g7Q<_V4|E+qxPM`_ z<7M(fBkAC(v`PF`zJ0)AcJN`hH(Pfqg5b-849!?sAJ=Q;MgADu(EFj!D`VhDvDblT zH0X7~uvs|aO=sqMo|k&=MP6#r+V7Z%8SO0sT}{0M*pBof6C1pe4~2J?MJz`=iR90G z1%xHWtb0rfmIYf%8>fk{()5aA%(7r!Ve@#0CT3WL2>N(6^W`{P6I%5(sSTmv6dC47 zqofp*L$pBY0VL#8HJDYw;08C`7cXPvcy4+MS9N@Dq*k}O#BasBN>Oua&RM5(JUM*s z6#$XIN1wdim8qR93u^JzO`|47=)^DvOLwv@kT9U+KneeeDC0;vetD^qTxA7%*r8P>IJ*P zXiv!ebyBJ4SkWIYeD-ofb|Y7lQC;A)M*zg#G!MXz7v9j)cF?HHcP&+1lKN(hSL%D4 z#v~--g@NVw`kU6Jm>Qa$pWz)jFUQXG|D;y3BM^yn#g~BUYZ&zwnX9=hFfoRj&wh?1Vlv%`Zy}b$IBGeS`Xs@3t8xN3@_->OpKGpI zjGmO5P3|gno%+?~GTA+HDDU4v$QW~1!NO-U#v`6Bb=V;GE>zP?s2vveL!j5CNdCRj zz^S*T9`nZ%G4tV;K`&GF?5}AD2KlO z62;lo!cna@qshYd8xC+HMmtJ|e-D|nN|<>RqwC}?ryd3)H7|A%*wQyP+(ri2Uur0Z zonul?^<~XoQQt&VC!M%WdlFDz@6zh zB#}B^TrrescsOOJQb}A{4%MJzafTU@kIZG;!^c`YlgQ8FwmPA}yr9%ju4)Up_VOwx zr_78K)ICjkFvuBfZwGMsGo5ZOZ?+d=u;e}c^0nUM-P>)f*>i41csWL(bgcOjKK6(^ zr4qp5ZQbOgKvnZYo;|*by1!bj89WyOzcU85KwWVVpUO&biPXhBx?iwd8NACmzSnzi z2NIC2{i5lCTlc%TUb6`oe+-!f!S^)qMm%-+h|>elac4WWZ&$PLDGiNSXjdfTV}hID zmZ`W&k_$JhAzzV3E*9 zZpO z4!HRxgoP@>2|-~E+mvk5myhO}4u4Qq0=t4FW6Z|Vz#;YZwG3y+0zV9hvGg|^xGK$E z2f@l&PNLf?i#=;>BCzUg*m^0ABu(twLUO*DgHHmcWNacP{6t?9T_0?pY)hcqL~^lg zE=HO8Bo6(-)Hi*4itgsrM?0H2`Wi7E+@BLhnh3fWT|moa)!_Mv)UQ8{rzn7z>)` zmOJ(LElFFC{>J!lq5fP~PlR~}WuF{4SA7zz>Mfh-b>taNS zQ=R?0!A7u_=i(SGNIaZl4lAoB5_CF5vu`){D3z?mKBq5{gchL_MCw#qdzO`}7qgn}yf+hD8vB6jY;nTLfK4xbrg4^hz z+k^I%M=)>GcB>Z>635{2sIHa>dcA@?Vx?uVClJ{OYv-Ie>wI!!yje=@8F<~ChAo8W z8dd~dcZKCv;p*C^oOFw$lG_ulC`DV;)1(%Y-P$8!VN#}P5~UL=Z+TrTF6uAT);I`Vh_^mOgbYh?A_TN9hP_5f8!=?m6 z;EKnQt`NV&w;KIRGK;+nlj;|R(G0msi z2xNR>|=9&hkY`cX;xX{ESnt{rB+By?e&&5PG5%9 z6$iM~n#1$+9pg~qOU%Ks*)S1+?AE_F%MD^nHxoZQ^7}@nj*U(c znT7*Q&9xx*knQw}{q8(a`4c+=G$>~VntdqI@W`7R^~%-0#=-h;{gCGkxbmUL*zM;u zxe${|O38Go`|R2xU4^S2Cd(*a?rxivW|HgN?e*4VC|09tH6Ei1gzbv8ebex7?o~NG zQ>v@a``1}%n;d%}yL^V4#JPULaMnIdWLV-UxZ-> z*nu)g$VvN)Wy8D7WI=a$+KxPI@mQc`z4)fpFTY3Ky^-(ryJt~+er)S^;>Q0K?!`XJ zXg^3Sc5rNKaOITDSOGy+68l^8;1steK=R-M|1}}=`LIqh*N)y(m>x~m+k1k^)K!L{ z9+p50i0+k^`V+=7CH4r)k&#G3Kd$V6EWcwEHO+TeOix5F6w`gW`oia@ch;Lr5jB%_Y(9Ib7bOqk;tVJONsLAEHJ>6#@D#ktDHl4rE=G*+?hv; zj3m85h)F?tR3p;++_{hs^SFxzOqX4;W>?=jrOQ@*dlOzYjyguk(vxXfSf%#QRd`lZ zIxQ&8eynxDFU8)7`Qswm*|zGmPH-^;3@5Swq=2o@Ev7z#ppBHkDuF}HFbRk z42BFJ_k)L+<}d^tarcmsR#MqwaYBbd!s@gzb$x<=%&;QRb--DpeW@#Uw&A%Q??@#| z_=Z|r@@x**m0(-<$jUOZvyddn^9$Y7Q3ssN71c5G;I5TRlAu8>w|EiH=Y$22{W1cE zt|v6j_WEAd6-F_P9tgJ<&PV(n>)5*O_abqn99RsBq*M1~xB^piy($6yzEGcho}v8~ zpg#}eOBtF;6y)Us`n9_8=1Qx~G z&p?;s2Wdf!Yecz0E}YQ#Pie#zi;3*%%ap$(of&_)p7zji3R_+EACBWc84kVj;hS!c zaLi?gQXH%MbrQKRucv|5?`x2+1-lfqsvxc-tiKIYT=U(@_&+maUh1Ie0Cxh(6$QURDAdu+q{(uGuH?C%vAJOhU;8hl|pD zompsFa%C`$BdkWBSu#w%yw2`zx^!Nbg7NG8tl3BVb~RFtHk%fnkpc_LhK1!KcBWnV z3tTF$tSvIHv$JQqTaVH0T!=i@`UBXY{FjG=rCtND-d=t--|{KmWtV_$n-1!4I0XD# z#`BAArno4((5nlQFCmg+>1p`cU}k`>1@hi45n)q_F1!JIM5NDQoRfw@%UsP)Uyj5i zwCi}*Y1ipwq89I24Pc2&3BA5)W8N9k zpt$%lv~!rFYga(WkexI$F6uYN>LdE;zNxRNkPLAh>}5n)h7-<}@n)~UC5tlnmLmnP zW;DbBVa#SptuvDm11$3bKed^u>%K)!wU%e(yh-)l4C^x^8DYvr`iZPT)({R^!nih4 zB)#nh5UE?y?e-e0FhsO$G5Er7D^fZR8q0VkTY>@+`yt}}>Koh4&Rx5aTPu9#5mhgG z*k3yQ&&zh#F27Z3nb&m3=>{7j(mXN96DK2~hvSJSS8rSib6MsKGToag@lb(g-W_ZN zn0n8hu2M{qIM*ZmlmAqwqa5+UlNv1(2ib_#44(&;Sk2(}63s+?R&JFESDFmoJnQh07^4YT$B;LS3VsCR zDRnggay2VVadeHf2l?8tmHQp~iI1NVh z&U;Hbm+QgaBl(Tqze}LiSQC(BCh>JR&*t*#P*eGdMtW%7n@gh&CQO}eZ}dfDnm*;K zWZlS$9L}yms?eYX@+uE8l`L6(IpoFR$#x7Un~`QYA5o@n#P^Fe8-s*!c<%a{BQx2~ z&V2!VbKa5@;NF^iBtdZ{1OcN4Bd+MkO5!RD*`E5`g{k0h1%1)bMk4nNzx+MzddgTH z(we_uvC1$ATY?akV%5b=7}fbsQGUmfwAS%U%`f+ZD|-V4HBX^bUlH^d-C(unYuVpL zRl&aIO#oCEbhqhVRN2e>%+UyAhYhlKGI{c;s$qzqqcY7B4OiQw32|3uv+5;dG*itd zA1Rr{j!BtkyxUB{N-7F6Y6#WQkQ@LiWeE`jN6`M~0Qt!^V~UUmH2VX-}VAV&AJ_9IL=?6+5AAz_&@#bZn*q)tZ73XOTh>F+98 zj)zxa?f@W`c%{o6F#@T+XA0N4ncXxh&!$0aRWh@1)TA^SP#k?;dzqISId@oqLxEZL zYCy|tOZpkPNgl7c`(>*o%9-GA`aY~}&A+EOJ~>J%>NvQ7HEc}`(*Vjw5(|;k#qk%- z`{RfQ!06tqb<@a-ut4<#z$k5 z*q>8W4X--(=g*1kGZDlS0qn!b{J7H!pg7^zHjak$bA~n+0wAK>EGh5&P`I9n_}0!# zU#7J=o8EB(G@nuy)>h#^r;Ei5gJ;&*1F!Xwn6bR*vC?yWQpna`uEAi3zo`d1u~ORe zz;w{nSPdxaC{N5{!k~M4T?Uj^O-*|8#4+JsVXy0XcXVS*P>q&lC8p1kj=#cP8Fv2Q zAXfOQhepzNNV;Af?psAgg{lCBInzinMs;qMtDMtNxP8^?I#Ff2u17hnoiSiT+@z{E zD+E-vxBm7}e31z*%|ZQ5P2;KFw(HXUZzGf<*Iz-Dn0xZXMAZ-Q z6r@-bAO(}2-S*G_-mX}EH&YGdeEYWqnEt(Z7{)j6vWfYimgH7&nR zCg)udl`|!bOe`NFM>YH z;Kq5{pJY#=&AmRm6?rnJS2zY-aLNe>jbK~P>X}JqUQZr$402PKk|{tU13p@UUl_@0 zA#?{zPk*t;gzM+9k9b*JXjpxs0sV`Ub7 z-{du4wH-NGPHk1;hX%ZIRc>^RBkV<~%I9c46<8agsLt;xSV@UDV+|V&iXq$@i)h%n z$wmVxm%obRcUixFXY%iS{?5u_p0f)v%czCW zKD)x=N`Fs<-5qTH2}1i=!*#D(zn~j>Z*HulxBQB40cqr$dobSj+;W#&Dse6#=|A*r zKP>O*?x9uiu5(DyEbz_b}F_+V+{ulO}tVj z$SxR2u2qQYc$+HBh0bR)Mc3 zn)Fx-$J)jtG^=mw`2fbKpsm<^RpdbV9jea4^0$X=r_9gwHMsYMz9Icev@CJ0tFN+< zD{&F*#p(uoubN!o5)+YBhnyrAbpB>vIe&ZbZL$-}Rlk0@vo@iP7o>Sudyo$8TSkeX z+uQwHk|Go?f;~oRPHqLL#>-?_esLfXr*#~@lxFJKQ1t&iyFruYl$PUJAvfNZ|SZj%FFEDjtGt*W76}tHMd09nx?j};F>F)Pn->u z>Xv3^TjpPXk2O~WfxJnR%cEY`e$_0cZ}ekM7v#_90|C=4#IeLKO2hnrnd!~-8NhqKnH zx^@m^J$BP}h4;op*rUREAY^JQqF*Z!&SEU>E#$h5-8~IW*LT9#U{UqY=jc5}eclbf zpU+Ae1_e$zn$=))yWN0oXqwuMv6+!v4qxZC0`tGE!G5IAl{t}#={PL|nqH|2t_6to zF`QcFXe?r9X!{E7dtZf*3s7g6p31&c5RLzC9p~P6WE)c`6&7i*3KXm#)r-jPZJ;$L zq&L_d1Ce*5N~$`pG?nXRoSgb|oaT;QR3pR|ppDXpvB`s_{`Nqja%!zHnW$LV*63>P zD`Ttba1~AvRC;6P$&`zJcJD*!ql?SV4$p?I_7Xv*W9xmsSH`Hk^4lVqdB>Ha&Zs?Xc^UjU>_xts`)ta0vizex*W7QF`x_ZWDW6RDTe z!@l{WttvlOz|%4D`CM609Qv4))Zo)$9s15?h@~IKR8{h-=pFqm`^!9f4X~7 zp(JuGJ`~6A8RzBzX)@BPltlPDflEZ8CDe3xs~IE>VOxE!RRP@=1xf4&2*3=rls_G} z^)()(COLt0-vbGaX7!6+#+PM}KEVIlG(Q6qHGnI;#jC&G0TesM9^(y|*J*;Pzox zM-)^PG}S=;&EBVp@uy9CQ9BIW8!J%NPe;QG>o=FOC15f#VVB$9QxW6Bf~zb~AhWT9u>!a%Kzs zEY$yyn160XJo@PRG=JSTptk)AkOwF#|I|pE3Ht3(QTcQ)Ls|@A94n~Rl3PF<_@%dTJE%$S=nm@|DOr=7-}t}s<{K8GWL zj;@bjDl={JdOTsuv1Zw68bfQk8Qbjy_aRbvO4yWVpK3r@}tA=l?2YozpJEV#;f$uQG4}B zAXK0}IAnFvFIfUZkqcG5BXapH5=8hGpr7=_+;b~h;yv{q#P=4GPKbpz zk`{}+c@&oa`N2Wer3ydt?}Dmj1!1NDfNMTTCzW-h*<@o*WIJ@=YoR-mKEr);qw38@ z;zZNEmoUm)xh$W;!qF%;OkzCd>0DKO47^Ga3u3hID+IE*bo09VmR{^vWM-*EA+01l zqeK=Spcgh5Aw}OqycEzxf4h@n%pGpNe&3p@_HZi{rRvzf1RI%I;Q)(vQ|1@HTGlO+ zVHmy9Z@XwXd)1JA)r)L77Mj;{bE106`MGRS#xylC4H3Bsn4l@_i>_^a%m`@onSd_p z^7pM?d8#V8K(17C2hlnYtDU@crDOz3UyfwH6Wu%_){gZzg2BO3_W^ltMA|S*YZ} z55BsI;DuiQ7I&Q0=(EBbdoySJ&vQ!JfCRw4r|A3B?-wPBG2I(l*_t0$P zk(yV&2LCFR5sr1LMXmr99-1ha;vKDqKlSOV@A=cUz@)2CB$R^@M(oM5udWH8p2(6@ zTCEC0+VdPHz~NnOfKrV{&|{6;an-YC=gpe|W~s5JUt$GDj0jgI!;NX~7sjTJ1lwx? zzKS*Mcg;V-4vjtXkSu5+N%TDOil%M27pUO5CxWmmMdMfvhPESPxTwPSb)svTHGzU6 z#CfhfIP=>&VcNEU_FNRNq`3+)8Npq)9b+1;N~Y=U-MzWAW4tT}FtcWyr|H>Q{elrb zRjDcHrUb6?s2`g|Y9eRr1CqjW9uBR^HE}Xr(0lxQC9plF?|Dx}se(*SH9RdI0k?H! z6!$c^R^sI$b=4<1i|415m|ews`6O zb{2|(9#|3Nq6&WfMziFgO21A5aHHYJSoC!r!yC`k2b5TC;Dlm8@27-~QFS@H~OA1UmjTLqrY?%hAs-K zG83rAs?i0dW@H!xyl%2lL`!{BMngrZ3JCB6bnZ;>7ez!CEp!>^R;v{KY;IC8WeoIW zWl!@evz>95P1Ne^K(f$r(-y*mvA~CC4ix%E^mPD4mVOB#^AEy*FCVbzF#=+(O9>C9 zSp(RN-`E(}`~b>-7Ux;|AU+QI@n8h!TNa!5TsHL@k2!U0yQFgMVHxLGSR9&FwN865 zHp^JdvC{UV6aGXh%j3OeMt1;)Pu#C=IfYY7ev`umB6u!ThEaR!sqF}?RYhrgalOFTp=%Jj2M*5|hTKOir6GyC>ev4z7 zzoz-fV}r8U1`PD*00HN=D-P}EqWjLCN6e=zw!SV=sib`YlyWoi0JLMeNrCQd*-O-0 zET;4HPF~s7)aEoN4_B#HjTQR=g3!kxptX6c2L%hK&KMuRAhy>{d^plGz+O!C=h1+> z)4+o~KCa0@q9vT2B-ZH0kL&8q>-d?Ws=o<(4qER0`3>+>e^*PGH~3%_EB;R-Ywiba z5SsXqtfidAFZ|=8^m-;@2@z&r;kT2|96NSwyIJDB)J!?_g>Jjym{pVTAR9M z(BD*N$09LSL1wce&5?nK3ZTt`&7?sYyLDAC`USL0rYoy^5W94IN1sQUiy8g%q)$Ps za>WGMe*7LQaB`%fn8m+*4)o+Xb6Vqo&fI4z3h`&qKO!8VoBEQVds3IC{96R!z_r?i zr{gsL+dplJkok7JlKNIaW7d~|f<`EpRR5jDfBoY5^K3<`Sd7`tZL)g)`|B8!lm7TW z$#_ACAc&+DxBv1`P?(_F;nv}>kS1Yj)Xp^}X2;@Yleu91o8t>No_+!(q+Ecsy`Ws* zGd7JY-T^S*9ds*hEa;qWB%R7r;}$|0N{!KX|6$#m+4Ix+9U( zMZVPPMqkm_6$vBQBM#+9p)x-v(|!=32{~P*ZlCfO^L{mGm>i#v1^pBhA=#sVuQ#?2 zxqouo;U8bP`9jdns$*P}w=pO8Jge@52c_Otd)cHef4jXzXC$eoRj|iFQh|$0 z8fmI7EzgFz&u`Fe3~eqhbQ^YX^XZ|NNNlgHr|ukVeCXtYZcE!(kRjH|sdn<62UD)W zY|jsQyR;MNs5$TY`K7u@x9sQJQV%}IXf5HTst?4+ZHf1}mK}UE$M->w@9jgnZcic} zMUg+qI~(>~M7*GVO|x5Kw#*+he$y4%&RL!bt5Rfy8!>M$oCrtE2e2=Wd=C|bglgP? zxqr^2<}5+Be-MQ##%PNj%@EDgd(rhJGJ|pYq0jzY^>0t4`)}JAvM;t^oA;`1=>;0# zR=EYdp;G&q551CeC31^F=4!LjLlYm3*ypXfUaKwOo z{)+4sQ;{%P!^yY5N)rVJFcS(H4)n0I}vnrq_#knp7S1EcSIg`HHbs@f3j+4ZL&@`( zBVwl&{bUp#eA9ABG7dEL`jTUU#w)cD=7Ou-mOMc%GRE!m#%`*|3t5F8*)Q6)A zw+<_`->!8t3p|zWb1Ep>*-$MAk>bf=EFs&r z>E76`{}8XVogccezBlGnmi_RCY>jkPA#7f7AY${nB!O4zEr5AENtyH6f6|w!pz!#! zDC}&UX6Sp7NUaYGC2iEC6N8UGpN8(rfnnm{Mx+4B+SC_dx7yUr&dipYp0O%%oTZ5V z98djvjM*y-=!;w37q=;TI1RpNRn*GLarr439zbVh@1fwhXD!lyQj;p$Mt@A><8k+@ z`-4-D6+m}zia&2|zZzqf3K#36CQUATsbBlCl^^f^WjcgT9r;VIgiJ*mR2@pH+ZhERWCu#q8GUU%m77^G zp^q;G<;6=(7OD6g?PbO0GnK=Ha7ULAACdIUH0kGIyJh{H&feKO?2PZ z9sBS~qR~WqE4&hooi!Jj`sbNDRc`B?ex{;}jtI~`_Fc7arUHx=`8>YS)A1w@-%tsR zb2_(0)Z>xb3JTsYjj1lvj7br78IQ4C!v8H<8dNB|_$~R2TUG9ak5bE2z~afD1Kphl zMD_D73qPN3rgf*`+{~6JIqXL>hC?2qrz;v}Ti!bu@2&iK?{@9eh z7jnct)co#@XoiNNrj9JSG6b0Ag`F>1KzXe_qAEmzC z*sh5Qx%E|%FS~R`eVXVoOIc=G(F;gKjqgg(?gW@zXL1AMG%fzEFW&^|$wY2!xd#h#M?fCKiP`qj63%CXJ+%4(JtM23Q_ zpfvt1V(FUlNeAntx-#a=`48=)=X3Yc1qIPn_6_aSo(bAHxh%VQKb&U=Nk{wAWxnV8 zW$63QxaPt67NUEcG{&CIEhh%-q$~WGUjQ&a$Ej%Un9ylpYPa51AAWZ!^3wXpKf=2r z#zcPg-5ozzX!5PBX=RQ+ubfyM{`e(#^|RB|Q5xYg!MnFZ2+v~J)*)LCJZb?F9d*vW zcwzUg+w+JAxHY5`4&6`%U%JIk4A;EHwQ`0L@r>2JLf0Hx*Sit44mW&NO~234ai@$# z4H;u>ne^$v?^Z}?D{xp%`Ml zPbclw)eKQ{j2nr*k`OOg^=DZI3Y zZV~Y1z{PrS3jsvxd3Hb)W5 zaq*tzw@$rnw?e!=h27eb-Sm{Hgi^&-Wrg++Ky#f?Wo+G*_d=8=@4XYTJBG~Nt8%&3 zxlR=5Alr6*{ep-@ieX4vR?II)*D@6xZrcqb1;PbPvz}7sTD#G@;+YS@bj8Fm-&iAR zL0D9AvlHE9p8Npk7O+pz^c8y5D7AT?h!=(tUof4miADTH(^?ZPM29qejO| zN!of(M2~A}`MPh!e#IVjLN!3o`x35_yn7!@3mx`zhSudp z?J8!g@?|ZCOSl7nFC!@%B)*MNSMJqz=njZ*T3Q~#dm8ujEgz*omNZFCQ*{$O8}6fu z+Y7HP#_C_`b-r4?mQGfwxU*g-kytsSeF47hXUOLN3OI}#wO>a5oBLOx{GPkWbFX7e zzR&*VfPho0Bi5op#HuYlzF&-Uep0R%831Y37IXT0ZdH{L_BMo?E*1I>aqj1!r%nQ- z(OcG`iYPuE-+AM`(mPS}f-_7_ub-5$6&U%tyVkq)W?WFWg00_BrPA&wx&# zAKzyoB$W48xGHoBD6szbZ2*D)GbSJJk~!a=E#|$}iT1vl2Qglm6Cph^qNu43{H~({ zp*yZgcZLONg&BN@@uND>vQb|#w@xnGMztJ{1GxlxKn;h@jn~c8YF>Q6kHLlSw=OoDQ{NzjOBl zr?pGn%%5FOmdp96_cyBm4(23CBCg4Lbmc*c+6RDx3U@CoYiE?dn443ySr_>kiwUJ# z0ycsKoHjhVZQFBnfvFQX4>tY0nRa!~JJMgV2Q2x-u`_SVC4mD?RIo$v2TT8OVt@T( zw)DbswcBoD;RLT~%5EKO?l^d}t&w6j8b7ys#{k=~EZ4&WzhBUdc(cTws*tjSQG_w? z#=x3Q#G7QUHRj}ZSnqBD_yHwEacGk%WmCpRf+JjvOAp`zq|KNB%lUY2`u$CWUC z#l7r&&Q#76HEDrj_2X%$1y6gbI$i)+GexFev1ife%$EmoB@DJi=d~wXI0w6r&}HhU zmmMs5@F9LjG@(=U@HplSqV#33@g63TZ-nHpAU00UJ+2?ECVY14nfz$V-fy~QxJ1xq zVDl)%6*xJI%!*KFFxLpE=CvnClnv(HI8L8KjUY$R9KL1O&k07Qn%R)q@B& zwtMTgb#mD!R41Y9AhJ1eZmqY%-7C^>o=J>3^ze-8sy=W6XV_H>)5G$1l+-cBHph`% z9H7X-wYZn4SFr0jbE}1hQD#ewwivV4Sj%R}?1bj`=Lo5{2?W76>X##hTM|3Z$gM{M zz{H5pvs<@`70Jq;`xYsyx*M-F{qpf)nTNO0lzgvU%Gv{$g84I~I}I$MbMY&S=h7RN z!K~DEUtvN9EVCO$@fzdpqhG!Tk3VCd}p zScB)*M9q^gzJ%L5x$@(DJ#JOGc`cQMZou0W&d;Q7=sR@xu1S4{V1|Jfm+#*{1tdno zEr8_0yTce!`Ed!}vF)eITtCm_3J%0GPCtIQ<(_=3S*yJ9>aaCZ1`YGmGJ9%v?C1n87g;mdfPX-(tt*rQ8tuV=^)ecpL@ydx~=d;s5_2{|ma`@*Ph$!ls- z*;Iwn@v!&sbcV~5$z?wqz5YRUha`o_BiMyB&MZd1zl@1{>5dtk^0co~UYGv>rgSrn zaKt3$+p77-`RXm`Uw*obO=`LN9Iy>nWYupU?`EpMhx%W}Me+x+OV;enOFCyCOAh>l zFO(8LA`9vBek^@EwE~!jCUM-{kPiasrjXXIx8iV32VV4I_eA~C1b>DNEhdXYAPNp? zi6rUoVBZXv0#UytiyqF6G23>kuXM+cJuuhBE6D~l6CYm=TT2=ID?Ke#9!K51t@o2z z&fe|n%Ak6UD!kNBUn-PpA%a$aAtnYGLPe86c{vLoP07DZt9m*>lkXf;j=#Rzz_mMw<_`mzNWWF!re=vvs|AP2nPWpd6^>duNDa1LT zRQ~hjsaDTF6-|@=`tM2-b@xBKRD9}Db@qRMs%V-g1$y$=&5EYhz^?`T^)lB5Ld;rZ zJjBKBlo9p`F)Te!Y1Y%Oa`8SUFv%aDMH6@sEp?P6CI2 z<*kgVol<}=Wf$JM@BgQH=3I#GZpW6&GY9WNjS~zes$Qeo&WNTZ?t_# zD-de|w_?{3aiP1H9n_OQ4(Y&_BZli@x1GQ%{k1RMyH=SW2q>*A_mNia0 z0<{saeDz<)1m>CIu$X{E=jxkr`_D=bi=Z$3HO`sG08~A;GnLBSU;k;^e*$+se+vxy zWE)_!|GK|>ms{1@?x3d|#c^6du=&3QBW6EvSN`i>h(+$F4*$5nBt+{M;4Ur4JcRc_ zQJ_8JulI8geD;saoj$s1zvqtsKW*u0;4TZhLdx?CQR)A5S=3wn-RYEcnYKypr8I>^pye|9?gKgf${H&E=oQnpa< zOD!WQh!9F@z>(9{ukY?=80^L!V;E@4#F#JPPK5o7Ab)uwph`+R6YEkP&TcPiqIa6_ zOwIjwvAcZ<=rYM>4TV-Fs-+Mq@3nl47cG~snih_QDkAL4=oTEYCVIE|e~|DOr-8-@ z&l@Zj4JCtSe%@xL80@Tbb2sh`qgKntQ_b|>CG*REp!-`>HIhY*rLt^Ey5gTR-<_Q) zW@W}vGFfsDDS2u75vKnMEZ~<9_&jbx6XSw4-JODAIchj$*8uYWmsJxzT@Ey4)hc!Z zzc&MDs?A|GuMwEFqqNF@P^c&k2jHhh6eK}U@-MA%<0wjar6S-*7XDeOr4vQauYi;P z|E$v8{(!!70ag7=aW@rOnKHxFi6vL4DoF5|K7hV&Jo#5uU3HQ@c+!)LOh78fd$9zpH^ROR;{>M)tP36zrFim=HNsfP4;WGzWCp!|`{NrZY|7AK-U%{ga zYjx~}({wt72i+!ZkhqoooX^~qV(e{NG*OrjU+R ztX1C*W3kY6VuR0717%=yf%g1=+FUm;IoR@B|0~N?o!5f#tP@VP)nTzmm;qH4)x_&3 z9kMIRh^MsD{|}S7$j0}mc}D#b8eO1EQAqTar(ISvriA~NK5!3ccBrMxzh~x5Dx}Z1 zja1OTV#Mkc_)H4ky#tQ8(}$;iXoj!FY-O|`E~F-f>crTV7|ZfjW+?cg%FzU*scy*e z^oruY6B9?6Lv}pztdSM3fzim}XG4kWIi(SVHdiM9`~dIt%vu8_>3^~J-ceB|+uFEu zJfoumDoBv%2n{M(G6?9X1e>5BxdEY(oSK{(#sEl`MrblB2!kY>&@@>|Em?ACf&|Gq zHPD2wT4|j*cg}CEyVmzx_q*#}|5Ksfs(N?ry`TL&wcmJriXb~Ny~`M7qEi{3* zYD>zJ2pidq(owA6ze>Ak5WSE!o$ff2izx$gv}EK$%u2x@W@_iX6J^5`V=am4kkL?& zxTI=is>uFI1h|C1)$Y{ncRH)bsMjZSQaCMHbKgO^#SYF<#g=RowIJfK2{WHc+&IvZ z#5R=J5mqPJEz;*D|IT_EioI+2$MNeSy{D5QW(%b@^#^YKEF=~`mOP-6f{*=PkKxTb zl~G6)K6r)!KO{yFaiii19TCT>mLD|Q=m*HC>5?LX3UVhRw*6VEt;UH7)s78~5ECu< zvbh6X7eXRk78IcA%{6586_$JHY=}cJG^0Z~+^Nm;=K-MlkLKL4>EYoqh$(|OzuuRMIW$>*Fg#M!whctpCW^&M2C~LM&GXBTNb?MiyDs^ zh8q@Gj};AwAQWOJzWAq?tW4=ViQ|(w_IGBD`f^-m^(GhpQP$$8f#3wo_Oy+nqKSb; zE%JC2iI=K!UT&**W!1v)Jcm*PhqF)UF2vash#TaF85RwO%8|{2Mh=Va*+KX+ZWw8@ z%tW14-^xR5Fpe6Z?IUSxJ?sY#Xa$Xko*UKQIFE*jf%Qh}alG^VtcMgDGR`e9=cFa+ zUQ;V{+c*$_f$hWq0F1r(QbL?J5(K6u0jT85maX!iwy?T@5i5v{omp;2G3om|%uCQV?9?j<29!0@*j2P9F zz21EZhdWz~yzr>FLfgkh_LswOK2 zq?>)k60FZGewqPgAls86#veDuHi;W~0YjwveV+#oeT6HzK?R}NG z1Kcgwe@%DS`|#T)5p&f^GVy+bE}vVLVFx3i316mN zyv09eJaJ~(F(ScfFvi@W@?y^^j2F8=KZkZsl81m*f1Jvu8_r=Tl&8~hr;po$yD9v` z-+20&ob^viuTLkRMn5EaFUC8L_e_o`rkvKvY2IfyWE2>FciHv|%dwz^9RnQhVZvpQ zO$-~++ryA8wQH8r*4<;vpTY+pC})FeXQboE+sOlgXcp$}t)X|b(FWWCy;089v&U-& zPRA1yJ_O^%=>MG|tE}IX{8WCc`O(o9c~@Iga3#VS9T9hjw5bMr%WcGNq0l5-HJ>k4 zkT&nE6Zmh=;;pv=q`_{Jf3wcWw@q^Hny#%o2iA)S^TzO+zuAjOX~yF>^V>$uY8P~> zic3n0<1Whp3E_VTX18W5LE^F0Zwo@_e@r{56$7AM;Of_3A&!+KNT7T{D)T)oGLr#L z4aizHKzEAo|N1qt{!e8>0pQnX!85<-M_+-BC@Tm?;G*206SgO!FsI$Ob1Wg_gwy4n zqS*h$8`)-K-NtYJQBHO z7&H>MH5AtX9jpBt_$c~I4Foek58?1xz5$QiT__%*k#S$7a;VtQ2CdL!eovqGK3m1P zQbt=PvQj1zWx*fxH_-8G4j;#m|5KF5roV@01nz;HwDiC`Z=(In%Os=PC8gcm+9efn z-K(1a{`XD$e^)NgR)k#|sRGUF+OH)?{$xoHntmRFjLs(z%-?Ml04Hy8x-@Am*uPuc zG_a*(8GrM8{|kaCXUyuq5XU1udf6K4hEE^3Xs)rN?yLVzkzr>mt_s5FO*G!g0%aAe zS!C%<3%LX%a*+BT%QcL>6jJO5y2{a9syTaTuof<`|hJpmV9NlNwi3p5!t_~JJtBRb1@=++L?Jm7jbHI zkC;$(i@EkM4z8dp3C z>W$Vv`w!a+5oS=>y5aOI(@O^91M4l1ZIKoZHfpcGIJSk<1J6r7%X>@di~&D!k5A`4 z-K#1U@+l=PObUk4`2TrMHN(RdqoA5~nnR$R)5n95a>Q%1{pRVvtqTHB`=6;f0#AEC z{!f|G{|~>8Gza%g4|&)lM>OQtdJG&6*_$Irl(w5mOI3&Rog+ssd=UW+3@ED1BhOdk zz&$ac@5R<&3O9S?$Q^RK?r(oyzWAT=&(;O*OGbyQK6c-ljp-s_;kY-x-TDO=6CNn# z90gjzrvqt+*S(G$VWP@(eE^8>y9r%~_p3lRfM1Jfs6e!~jyk;V40tr5w4O)50_C!u z#^DvzBS)wLx}=3}0b*Nq_S=0IaO35}bN%B1AA!PHd2j1*B0@|WbMMapic~z4gYqJe z-Ta?9xf4TC$z6`LKGASh{8KYlre-kYNNSh66eS*o{rQkZCLuI-nHx7;TGKtY#9 z6D2pjA{aJpzRP|7yt)o?m?I3gHN`l&@9tuXTj{UG0;zk)y`d!?(6n(S-a(ILv1+1l zvfu2a08C%f8!)HeR(C1thn=g`1sJFcQvC#D+TZy|JsKNR#l}WMS_q!l+_(zsP+nNl zDF)JCLbb79yktnj**X%-p=)~SowD6*Q9UJpusvZHMNecTCY0Kxzxi>{qKMYGwc6@4 z?-Q$@MiRCCSt73N?mcU&$v4bI7BaK-pI5*ZGb8gnN#2C&Qat*p!DQ>H-r;glTgycU z(*(uphue5t+_h`N`Bgp8cP`8V=RK|TbgwzgulPD^#ma2riuqs+J$7-piVp8o6SKXy z@8%y(3QG_X3xf$YW5>0_IQ)tg@S7W3)d_fP)s;lQ0jtr(Q{$DB{xVB?4BB~uM*7@u z_K8`=qbSVOa&OZqVpuB;u_~@Ag|bbhjDgp$W)i%ksbjii-)W$KI1G!9WIOrsIw_*9 z%^-GXmd;?GU9ifjpEK#$1&y0OTLjkSEm5atG59-I4(=24Z#;F%d2;$q4TLkRnm+^5 zn&1A_;88FAA2KAjs|`0-NoiTFVcts8{;J3fMjJ#Isd6P(Cm27#Debx%bjB?;(XGA zKEfE)I~k)PJK*``+6~iwsjMHkdhpGR*6ptxeZ%&i}exGk-`_+m3ZjZZB! z`~J|d_^rDy*ab@FUw5AJli4ErQlnYjZcPrZe8py&?0r=QlpVRl}tF)ROQ#oe!*TuuvBbx}V zF2WWjb8*+Scd^Ll7t5%i`hhnh2k+MDgnuM!umZj`Rp;YVWvZp@2uY0gR)aBmGQxL- zxq$|7`3pxN3x_TX)^_B)LQmc=#m&m6{b6N3rp9sgjtyrs{MYjQxUvZyzE*LO_$mMK z5R$a#y}r9R<5{Xp_yadRrpq*i^Il@vxQ$iEsRIA1sr9Kn=FS?&hL5W()x?2CZx_kQ zSuKCkVcV7?4_3X-3!N_nuTQ4j zgSI_9>fIZUs);w+v^S~8?*u^ADmk;EFyC}TS@4D|IwUQJ9(RIe_6^cEkhHxVM6=7b z@&3pphD8{`tBT&4(8lG|=kD+eue9OY^gkSydSmmUM3*lULhk*owZJyMS(cEi)=_TI z6}`;v`7!A0ALlMZhm)Ati(O8UexmrIw5yS5j}-G9$$#}Y9BqDHr_Hfpkf)Q#R&r2{ zCHXEEgF6dLVFA=_f~SZh*92jtgi|#$Jjo2<2TmrW#IfaDvl`;Z*%&L`Td7S}^234( ziVNpPNMh#sH4w#J$wAyTFMrFV(KG{kG)*%}d$QD7!^rhB?&+nY23WcZ}u(g7e#k{Gsmq-s}^&`1q&2;F)9eU!rH& z^X~OM5&H!A9X5fc4pRmybh*SPYpbO^NpYC5%1wW3^WFkcS#I&;TgN7=Zj#N`PF{_% zv8wGzFF00CxQTT~-=H@<(w~Dw3{{c1Vy4E=yB zX&6P#_Lc+c;oIW6mhLkBWoH+2PD-$MS5C`cRvbE`U7S>B`Y8}fo7YATB)f9)UTgyA zi|4xE?Ib7EY~wRp%{9uO-mL=TQg(~!!c>yG(dyC@u0I{BfdYxA@RO(ZQ)K4L9h=61 z2e@*2@Hx|UNdaNLPZ6W2rke3G4WjHHJ) zCb^w`->|PA-62oC^U9yb?+G5^ZjC{Vb_m7e9J1_2_oe(7>RH|HAqbhL(J=2@2-0}< zL%*Ro+|rFA8Z_52{(+S7VIgU3%J?Z_NN_}%Nq_!3h%5GaI(6{@&WU5sud1G+!2I1R z`bWTadDz?Gs7Lr*-#(gO6`sCiEacSYX-Du~B!||Rf?ySJdCmZL5IVLA50~Um^xHr! zZ-LLVG_~ShJzRbTR!5A1v?e-%oM%?Cy0q6lAhNeN;9>E;w2#b+v_c);j+KB`cVH#u zgO8y^&KC_7iP-95FTr*<#^hR05gi&9Mc9^lnJDj0DCbWn!aj6=V-;Js-^S)srs`^l^Vmj^Q% zSDbZ1Q}oQdhJU=!2l{`?E0Pwd{PwI!rUz5LJ4#H-!}1VWp--g|V3+5IiY~$kZVD0Q zzBK4iPgmtwO(%0y^9r1hZQ$WX7|8(aW}OtYI$#AltrQc$@={NN>y zwlM}Qv1uW>UkLiHRRc3)F~BBN5^X{$IYq4Yp91A8YnKUN#w!m^^g3rZWNN0j`ek<< zT$%>nf&1fA#!0*IrGfL<@gXc#Vse`~^dHXAc zwcf6uOsc%3=ap?W)4^Tn#G3Fb(QCS!K$ClT|MnAI4W!w+Y^mxc^2~*)33+=JdpuP? z(Mfl?dma2T{b&QbfCae)N&si;3FxrW{C7BcT^&3&B<$(&wkuRWokP0b(2W|5IgfF= zA<4ZV_honNL;E`R1Ypr?D!ue2w`-d(k3Oqj;McgxNr{g~yuh8kejD;l(U@OWmdei1JDKeUJu$>ZBtg1a|Jm@ehPVVU`WMfyl7Yfke?a}r( z3l{Z~^NrCB3vuR4a%{fdx8}T^o69q5QZ0)27n}o=z_nF1+muh;p!Md)cy89OhyS;5M1uI(wJmfmE$EEDPS z&OyBoWB<@&IcD2rUkmQ*d2g%k%khJyvL)m5MnjQ(>6UFu9u_MXe_i&{v zeu7k|b3Go;d(aUk#KKKHb)ArFOw9Jw(EX_|@2u3v_8;meH_?v{(oKn`KnHbv1iU*4 z57SHcVr3(Y+IK2N+pZLl_D`Mklb23(Bh^pH1$!|IC?m~5MxbS~1!_#+3`q75oAOym0rCFR}BGc{nkEyWxZkarRP+bGN zduQP&7vt081tLLwDI7F5C3ek%DKy?ENlF8IcW|Waw~xZh*RR(lqZtF8WoY1{kU$27 znk>I-8GBMMBRG%f!DY5oQgK%&8V7aW=Izk^uimsNU1ZFKNTB5wDP!Xc zqCHCQFv!?y?LB`o=#{@}h{h8L-k&oD{OO39WMctlF&leLlvLS-8Ev@xeVO`y-|! zG0PKq!FVqPocB$8dH8_wlksZ3Qxe!go`Hh#=;aBqwVG6d{()Tg0*@_~dkSi#EtYdK zkZ~1!{z7&Mu(A9k>+TK5hRU$f4+S9>WkF6Bl2xlloK^74e>sZ$4; z1?GI}FlHV%R)+D>t=9nxCEO%JPHzh8dKEEMzv(ru3ibWb3xZ-F1nN^7M-l~XmwcD+HUmC4G^V|F`wNVk&&QaepYRvleUND~m9w_L5u zDV!$ z%#Q6{Njt`QvWA`QO#rjkRr&JgBO{9$H4cQ<;f~pNdC7FSl?T!5Z~W3rkuOTGwFfc2 z8Oh7a{l$V^54ZF+_zgu36JtT|kMOOY+oRZwjvA$LiqpNDy8C<32U;2}&`m;CoR8+f z&->s2qUFl7bFf_|S1zB@M?~hy!nvU*nzWBM`%BKK&?@CV;fy^m^t%3%>5+diC4>E|n2K3{j4cD#2z{pM-vT5c}xm5oeIJoI=7dymy7uNo1w(_e%GPldW9EI(5--+(H<3Go z{`713tpnAP69+Sm*et8Q`Y%576=j~VC1;-5dKD8h_xTlw}o9Uv2vzL!v-r$pC!b6X%*B11-;Q20aXoN zq^Q48ftibt_)wyEt{e6r@vFN981IMsTh+QdO4!?~V{+a7o+GIAwcs%t#9>5xU&JHu zij#HVc^~RaWv{_65*?8@dykelM=U)X9*kYZ(Ho3gez0b*Ic^mENQCYniRyl-m+6;I zys0StGngFPQ9-J%+oxve@7oiEp37CGyCkLJTc_CNITZc0m&>(|p8k@OB}WrCx}9nF zxYP?yz|`AtL2kZYzalhtSls^IMjcjNgwC06PfC~<)T?smla;e@>5Wf!W^|EfKFT))bGA#tQ^R6F2IxhW(Aq-lhc3x!1&WKDUOPbp%3aCtiE)kLgk?t?Ut;n43kG z^ZWpFg0^5poB7gZ4u00f2mWS$@q#Gl6G`nC+q#h@Fe3* zxg`kKel6Pb@A!tu5tYk5({yR3!6T5U6JH%QnFyzd#{fTh7yTl;HL=>my3Uc_WZYAmtOwnZMP+Rnct)n-%C|Gj zr%HQj7e{Ninx?>p?Ca_c?{NF6X<@ZmIZ38}nAjvqbMlN8;du>uxY`68u!;SJq+0^B zu|i&E>bCkAvyP8xbLn3&o0%PRmil#Hd|17lR0qYaCOYU+3^7t}9LmU;PI>u~Staa4 zwV~L{hU}rLL2dT!<6&7Te_3~m<<~dT@`y?Dt}~Zfcwz*mX=X)LAfj$M6OORl-9^># zn7W7-L)y&hTk*>>Ph9g%E`$R+OucOaZS9-hmh{9eZf8vu@35PD$sMABwFC-JbL98m zDE4^d$jR@o_Q)kJ%E>(P^7((uAAYJ=aPYqEke!ZA)mVG~{4Awu(UH4K6m)as`mYp^ zaO8;pcZ)c3j`n|l_}}hEjx<(qM|@Mv%U(!96MneI50XKkkP=7+E`}jA{7qX`2RQaO zdaD(TJue4n!mZpq`H=F8163*T)XX_ima;@S`O6!7EYQ$HLUiltS@b7i8oQ7FEK##T zgvvsJ9qj3PN12~Ks62z3o6UDCrt%(aNApM6;X9|&l7QnQD zk-0R|xDb_cIN-AK1%X%aLPm5~$!M#G+p^DUe8C;q)uZs00c1&At{Mnmv{UD-L}=n8roM}$8*02Oy3;U3G8IL99S7TPXcI4A1_*-# z$DKj*8C;t8JqJERm{>nC&8$7(15=aXUk5C_R^sQQe$B&qt?y^U1o&qs`*~Yhw2G!P zRmXAHc^gH}GTU8S+X7cQ`Ts|yl~tNly^MN%Qypy^Xv;nOWhdmHyE_B{zPIqb_a zL7Jj-$BUTI_rn&A(7JVLJUhd-tUQN~;(}nvb!!bgLF*LMTt@d1uPW>}yrqqkJiS*T z&Z(hqg%d-Ho7I-lBDhi4e{%HN#m&@1(0J3Wqz~y+^8^sPsyz7u@U&AC(YeCXPL=oe z8d=~Or0WOt8Xj)xvJMm#`Ru2Y*uzv=ifdbs@|YI7g@u$%30i&Gxv5T^ zlq(j)l&$M=AbpeGTHIkIKe7S%=_7`Yu6G%Nm z<8omg8}H|YW0(v?+$P@W9&9J4uW_%}b`%NLeX`uy#g3zzrpBi?6;p`;gHozqrgh^- zg|F%T5$Ux^{p1ZC#E25H_9S`jZr8a#IiX_Y`Gwx(gfj?E;q9vv z`ya2{mP$!rfkh^pK@&$SBI@ln#(A8bjal#f%)L+xNmYD(Ajo}6kJdi-7OQG+BiA_U zkz@%{%d`od_|O3U$0b;akF;B^<)~|nT$HL`=kC@Eg!07;dKFovrXRn2=<6Etu)Wcn zx}v`q%%@yHht3{CR+=PICe)z9BXl-K$oLsZJTn{i-b9d7)1z7>)2Z<}Q!6_@?z~_X1h)l$aEIN9Iw`yQkZ?fL$r6E~?K4 zkfZBmY*dLPQ^G1C--SP9!#gX>!YqHmCb>252}8+R_a);=!;}ba zd7Jm^oE6AtK}KNa(5<<#1+_nZZ${4b*0k+a|9KQ0QCAScf*1Swd`>MS^X2Px>5z;5 z>u;}wWqH4VjHA|FqYzLAP0>)6kVnU9v$A|1DkiG<#PFmTbYH`o<>Sn3mr_;76O0_3 zY!Yip4$s4(+VX}5qud2N*rDPpas-zJ74_^PLq|uyi0KMH0gV+ToB!rG z>V#pj+&S-&CS#Gazq%0XUOhhZW@ftpvjNwC2GzJx_n2%#j;_(<#M<6RxwA(ob4o3{ z@}Ar58{Ie#LbSJF!yjdw{gl%tWpNxik1;ZFBRb9Y}xnO;Uj;>cpvSgz*-I>9b$(9xEwHSDe z86V0Ls=AHY#!d9~=*Dw&7M3cfJ_>Xihn^fqkv+PEc#;2Iy_pKJp|*!IV`kR2{VwCE zkjhpPEl%F2C6m2j zOpr}lTCO*-k}1hrMeh3f-rryyjn0#4!v^=j7pE&cS(4g(XWC(x?iZODI!|{LUBj}e z8<*|j(s<;`Or7WDPzKc8iWIQt(si7&JE=nrd#^Iqc*9aEOYI7oOMXu1@4IXTZCXST4|pwrAWRFONA7=x{gTfj|J_QJD$Rn(dg z%GOOuGnWR_dDze@=T}s2PzF}X)+^xNmTW#w-m0=F65N}^jv1gsXDV23`1yWDn>GA_ zsbXTYVa7v#VC>!Z8D#Z}wbZNIdC;OsorTu;?q^U2hp<;W!qi|bbtNm{KyYsOrdt5p z5;r!cL|R8zG6G&uT}%n9a3_j}IlvY!(%;Gs8migowYqrG{G zby-3#XRQ%kf|d;VF}ZH(gN>b9g8*Gf4!ygwuA>{yPO z7S2eup@*HvkbDH@o7ABW$Eb&^B0u!MjK za0r8*kfDhB>zyT(to-*Z9W?Q z+%{@=bns5_ItqN!i2@NSGJeouD8Eni`LnBc)a=#q>{0PIU>dlK%BSpkWgV{8;{JhX zP(*h|Dh#~UmD2izSlQ4`kxAAolR+BCCxs31CbT((Ykto-zYZxpgiD+22{fIGY&aSa zMd-cdJ~sH9NHFvc2(7*Bvv!=;GeO;LY`jLJ<9BKyaU!6c@tEI%`-KtVR0jM4!f*CT zc>B;?e7NAWKBKqdY_h}28iG!dBQ@nvzwhQECqC@x^;!#ug|Kd-UD!|{A$C_@>`Ys( zk({TQQ%%0^-bW~6`u^Ci+ZgI?JEym4XD}q{7PoABnHQ8QEje#EIv9F26>mC)oN0SA z*W-#=Xt{$ES-!i!MaG(CY9HQml0oavRD5G5+VtT*GbGDBDTjrUH66jl*Ft<&VeBF8 zXy3_OnHb&a)j9A?d}bH2wo>=D z51GFB?TZ3Oj!Z%jCxnXN2C2or@?9>;ln+m@KO}I3@}5CIM`cGxYYL=tc~)6vNdskY$qT8dnQ=bEj^x>$I%9l|TaknQdx@w%m#&PKo3sBK)xpzA%%!XL=dg3-0%u#R}( zR9BTkA$f<-eec61@JKydd>qBH7`mU5qzXIykKea}n@V|*ia+)>xv0wleYDTMFf;g) zUFiUwXO(1wqdR*Kr}My<4t<2WULc+0@RvVFDN}sJe>JwN&hGd7JastH=6ji*4?a>d z1JJ?xzdgeK`WZa1y8nt2f=Mfrj4K}vTOXrL6@d}S!t*uCu}aeNDAuE<5dP!?6}fi8 zZaA=dZlcJ22-7}k15Q!Ip(^2JEbeKmn>9FL`P}wpCMJB-);EYKUC)t9$+%L60_(3} z)Ae*|3?4f^5Vxz9f^hp}gKrd0wqs=2vdRu1zzvODvSU8RfCWuqj>vp<+_q+wSVZT|NXA4!8 zkWl<-qm*%@zN607zA^C97>d`998N5fi@A1AXSCU&LZMz`Smh-|1q5UDfY06VyA!kp zuv_Y@XE=HBF*u2;W#P5Ux?|<5C2+**aJ$+7aXZ(}WPGVZ*T9BPa ztQg+?mct@@&d{FM`bgJS-{ZwfNf#-EuMvO={r!F3?ia5&CTINsA919v3_1Fg{q>9} zd^&HLk=sz0FmTGW(lvFxaHP9475H33rKD&)lRO*1lr9rKsUdWD{ICqj^=CpV!wgKP zKKIu<&qeDf_XC4T2+LU;LXQ=J%2~GmOH;lBX@ylnY1jFt2!7?9&rTRm*q%+ChhIef z4(Ups`{yL(VT(tvGQ6FMR;u&t`e+s-D56%UHcZ2d!<(Z8fXm<^i`gG| zrG)PvnaXSqI{bWb3lDzI6$SY%Il`x(d2pjQe_B3~U7r6avZW1UA|zMpBW~2>P>hmI zmOogXVe;_N@)4*1&^5OhcD$G)q`ms1nUJ_xk`Ak8nzoBx$(~Cm?j{Q}-mFo$ZW_~v z&3{n#3biP>fxmt;Rye3hF<$4AUI~vv0sP4x=8ydqRPOOrLN^ycnOsZo-nV_8Z+*Xm zx_)5;GC(O&f&F$|66EUkG(Xj+`u784Ic7RN^CbxHjA-yCjeSUP2E2mZl(T5bY@=2v z)QCN_(jcS;g^-Xx=gl$}`j4RB%{FppXL-=jrL4>4o}xxs25j6`+G8kJOtHxv7sb{J zEVv&v@aC0Y@R%W z&>aG`FZ0yvgx@Y*9F}<4>}+{c?tZ3ikfx812^pe}GOG@RLgR}^zD7OqP!JEk{t+rm zrz69AfNx;l78-~f_kMA_xM@EhQh9kHBx>6^iq}YG8pJOsBbskEGX&a-w;{gK-k%Pl zk5~$Mr8xx$W<*sbaz=)uv;bj~^mg*h#B3dezR7e$lP+&#;(fS>P)U3PYMR5g-26#M zoovq$lU2JpRLNP~yP4UjVu zT#%Gkp`$>7rqxC6ssQllRuy{?Vt|<^w9b?+Z7@MY`OAE`b{wo(jg8JuIPT%H7||-5 z`iky3R?H)Xv<fF1n^yRbJUEB<+KaKc(6_)p%`Fc{|}w3n;i zYXP`yQ6}}E<+Tu{eEU8+`Xm{b>5S3lR*>l|*gv0xl#-q%5deqnql^6AdUdv03eC`h}Xq?j8SFHN+TxDm!wm^IU|bu((^ z;S-xuozLxVyr^0_C%B2d??3O;5J69L?Gz+*6u+?2!LFcv(_`ZBM&J1|uzV(91Xl*rnRYP|`WDZLT zkecK1vdnp3mTvy$^zg-^BK(41?qM68#t~`I_T13 zM3Ug?S{p)f?T+9Zqp9lYQg37X+c6j>j|;+BN3j=)kA*DuvPyEiC|iAmja*)pDnY8c zOuhbnvjqepjdvFty1Yf*l=_wJ?JFuv(D_YS zhNVnLJZ0qE4~|Vb9vGUa*Tfr-<(`>;vc)Cqu53N9rw>PgGHqNt9Ao#8B`>2)LVQ6s zp;EiME35GS*b7_OzHSzxAw5U1u5ob^&*G97Y^NCiBocrw+VS4H;mCSK)Ooe?&2*dZ zX%6`@t*)MYYBc5N687==4BA&`K&}6U-DMFb9z1PtV>6dPCbQf-NRO{C>LVyfWc!$@ zv)WyLFUfI}z!5ggLfZ?9`O^n_5H;nWnfdV$Jr#ttvF)A8$zjijPOHhEe7=^vugIQvl-RA6?gkKq^d`@&7Vu|7l*)ks1`WxQ@|K)xJ-_o31-~ zQ5|k33`%xeSch*W0j%iTHzi-Jt&lLeF%`?WfOezso z%;ZA3W?rT(Sr#Ihp_G7VcnX|K*MkoXHz<+mcbgl)jcwhkgK#8)6;J7$&|^S4V2f3o zZJCFPxQSlO{K%bKtL14{cnE#59aAVKeJ=RBD&S`je8;2c(J#nyjJ9jcS&YQ`jsr5e zE|tRWu9ZkGD#;%lli0wwPn4W!0QFV-reT{F)t?QPU+@R19^L-*-8ne&lWC0<94;+N zwC;lJ%IA^nEYealNbXb;6F@e+Gj`W^a2eCLch|v1ER4ToX=88}LRm#_?!V*Io}C z0c-d~STu3O>&?%A9Gh+utSjhuUGx_1LFc)01qk+rrvUaf5mUOBRj-hM59`jo=j@qn z)jVxEWK-!Q9$=K~=K!$KBe-yURcqSU@@kv!m*ftyuks#z8AsTokW8D2La?WDAr%pm z_2$}jiy|B2l*0@|{)sW`4~K#a4Cm(LQ*_UAW{{wJ!j4yvVG2`lOVUkDp$szVXNke{ zZ8X5KE@Z`ri&aH1+zh&(wi1mt#ktseEKMpKHO2S2P56u#1yhOV-OUGzpjAw2grJqj zHG%*Lcl`g9va5%1P_KU>Pop(}L_wCH2V#{UtTyuIf#iOTT*B@rC-3b%OQE@gMcl=F z?1QrX&Pjq5l@Ei~oIp069=K@hW>=PY4n9uU8T(W>C>BVp8@S($Sc~`A`~nwF zG+gV#cr1|14f5&MWRn6>&`pt5I=LdHQ+VCUcs<={d@M)!zF$QmMu)>L*nBl_<5R$7 zj=wcw@|-oNz^1ixMgq8PPH`2DZzCA&p)Ry6CPgOQk7u$_sVmxE&V#}v&fB=o9o zoUPdNh_Q(t8Ru~eDS_<}HblN}Gp3z%P<3NffJdQJanK!fhGqGa05UG+1wo^Vsj$QdSE!j_{\bM+l#W?0UeB+-@8Q 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

O;&Nqynt~C7kN=ykM$9 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 literal 0 HcmV?d00001 diff --git "a/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" "b/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ef357d09c787107702dcd5130a4393516aae6ec GIT binary patch literal 144877 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 z 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

Dk_w%Rl(JTasT@avBG7;opmq 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 +在使用 Swagger UI 调试 HugeGraph 提供的 API 时,如果 HugeGraph Server 开启了鉴权模式,可以在 Swagger 页面输入鉴权信息。 + +

+ +当前 HugeGraph 支持基于 Basic 和 Bearer 两种形式设置鉴权信息。 + +
+ image +
+ ### 7 停止 Server ```bash diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 644d24dd5..241ecbb76 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -653,6 +653,18 @@ You can also visit `localhost:8080/swagger-ui/index.html` to check the API. image +When using Swagger UI to debug the API provided by HugeGraph, if HugeGraph Server turns on authentication mode, you can enter authentication information on the Swagger page. + +
+ image +
+ +Currently HugeGraph supports setting authentication information in two forms: Basic and Bearer. + +
+ image +
+ ### 7 Stop Server ```bash From b001bd69007f03bc5490c791e9957c0f081f785d Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Thu, 21 Dec 2023 09:27:35 +0800 Subject: [PATCH 09/19] chore(website): fix link path --- .../contribution-guidelines/contribute.md | 6 ++--- content/cn/docs/download/download.md | 24 ++++++++++-------- .../621swaggerui-set-auth-example.png | Bin .../621swaggerui-where-set-auth-example.png | Bin .../cn/docs/quickstart/hugegraph-server.md | 10 ++++---- .../contribution-guidelines/contribute.md | 6 ++--- content/en/docs/download/download.md | 24 ++++++++++-------- .../en/docs/quickstart/hugegraph-server.md | 8 +++--- 8 files changed, 41 insertions(+), 37 deletions(-) rename "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" => content/cn/docs/images/images-server/621swaggerui-set-auth-example.png (100%) rename "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" => content/cn/docs/images/images-server/621swaggerui-where-set-auth-example.png (100%) diff --git a/content/cn/docs/contribution-guidelines/contribute.md b/content/cn/docs/contribution-guidelines/contribute.md index 7bb047fc9..1681da95a 100644 --- a/content/cn/docs/contribution-guidelines/contribute.md +++ b/content/cn/docs/contribution-guidelines/contribute.md @@ -80,9 +80,9 @@ Note: In order to be consistent with the code style easily, if you use [IDEA](ht 如果我们要在 `HugeGraph` 项目中添加新的第三方依赖, 我们需要做下面的几件事情: 1. 找到第三方依赖的仓库,将依赖的 `license` 文件放到 [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) 路径下。 -2. 在[./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/LICENSE) 中声明该依赖的 `LICENSE` 信息。 -3. 找到仓库里的 NOTICE 文件,将其追加到 [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/NOTICE) 文件后面(如果没有NOTICE文件则跳过这一步)。 -4. 本地执行[./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) 脚本来更新依赖列表[known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/known-dependencies.txt) (或者手动更新)。 +2. 在[./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) 中声明该依赖的 `LICENSE` 信息。 +3. 找到仓库里的 NOTICE 文件,将其追加到 [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) 文件后面(如果没有NOTICE文件则跳过这一步)。 +4. 本地执行[./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) 脚本来更新依赖列表[known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt) (或者手动更新)。 **例如**:在项目中引入了第三方新依赖 -> `ant-1.9.1.jar` - 项目源码位于:https://github.com/apache/ant/tree/rel/1.9.1 diff --git a/content/cn/docs/download/download.md b/content/cn/docs/download/download.md index d46c08873..cfb8a9196 100644 --- a/content/cn/docs/download/download.md +++ b/content/cn/docs/download/download.md @@ -29,17 +29,19 @@ The latest HugeGraph: **1.0.0**, released on _2023-02-22_([how to build from sou ### 旧版本下载地址 (Outdated Versions Mapping) -| server | client | loader | hubble | common | tools | -| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| [0.12.0](https://github.com/hugegraph/hugegraph/releases/download/v0.12.0/hugegraph-0.12.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/2.0.1) | [0.12.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.12.0/hugegraph-loader-0.12.0.tar.gz) | [1.6.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.6.0/hugegraph-hubble-1.6.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/2.0.1) | [1.6.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.6.0/hugegraph-tools-1.6.0.tar.gz) | -| [0.11.2](https://github.com/hugegraph/hugegraph/releases/download/v0.11.2/hugegraph-0.11.2.tar.gz) | [1.9.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.9.1) | [0.11.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.11.1/hugegraph-loader-0.11.1.tar.gz) | [1.5.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.5.0/hugegraph-hubble-1.5.0.tar.gz) | [1.8.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.8.1) | [1.5.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.5.0/hugegraph-tools-1.5.0.tar.gz) | -| [0.10.4](https://github.com/hugegraph/hugegraph/releases/download/v0.10.4/hugegraph-0.10.4.tar.gz) | [1.8.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.8.0) | [0.10.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.10.1/hugegraph-loader-0.10.1.tar.gz) | [0.10.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.10.0/hugegraph-studio-0.10.0.tar.gz) | [1.6.16](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.16) | [1.4.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.4.0/hugegraph-tools-1.4.0.tar.gz) | -| [0.9.2](https://github.com/hugegraph/hugegraph/releases/download/v0.9.2/hugegraph-0.9.2.tar.gz) | [1.7.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.7.0) | [0.9.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.9.0/hugegraph-loader-0.9.0.tar.gz) | [0.9.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.9.0/hugegraph-studio-0.9.0.tar.gz) | [1.6.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.0) | [1.3.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.3.0/hugegraph-tools-1.3.0.tar.gz) | -| [0.8.0](https://github.com/hugegraph/hugegraph/releases/download/v0.8.0/hugegraph-0.8.0.tar.gz) | [1.6.4](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.6.4) | [0.8.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.8.0/hugegraph-loader-0.8.0.tar.gz) | [0.8.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.8.0/hugegraph-studio-0.8.0.tar.gz) | [1.5.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.5.3) | [1.2.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.2.0/hugegraph-tools-1.2.0.tar.gz) | -| [0.7.4](https://github.com/hugegraph/hugegraph/releases/download/v0.7.4/hugegraph-0.7.4.tar.gz) | [1.5.8](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.8) | [0.7.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.7.0/hugegraph-loader-0.7.0.tar.gz) | [0.7.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.7.0/hugegraph-studio-0.7.0.tar.gz) | [1.4.9](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.9) | [1.1.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.1.0/hugegraph-tools-1.1.0.tar.gz) | -| [0.6.1](https://github.com/hugegraph/hugegraph/releases/download/v0.6.1/hugegraph-0.6.1.tar.gz) | [1.5.6](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.6) | [0.6.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.6.1/hugegraph-loader-0.6.1.tar.gz) | [0.6.1](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.6.1/hugegraph-studio-0.6.1.tar.gz) | [1.4.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.3) | [1.0.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.0.0/hugegraph-tools-1.0.0.tar.gz) | -| [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.5.6-SNAPSHOT.tar.gz) | [1.5.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.0) | [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.5.6-bin.tar.gz) | [0.5.0](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.5.0-SNAPSHOT.tar.gz) | 1.4.0 | | -| [0.4.5](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.4.5-SNAPSHOT.tar.gz) | [1.4.7](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.4.7) | [0.2.2](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.2.2-bin.tar.gz) | [0.4.1](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.4.1-SNAPSHOT.tar.gz) | 1.3.12 | | +对于 1.0.0 之前的版本(即非 ASF 版本),HugeGraph 社区将不再维护。 + +| server | client | loader | hubble | common | tools | +|-----------------------------------------------------------------------------------------------------------| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| [0.12.0](https://github.com/apache/incubator-hugegraph/releases/download/v0.12.0/hugegraph-0.12.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/2.0.1) | [0.12.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.12.0/hugegraph-loader-0.12.0.tar.gz) | [1.6.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.6.0/hugegraph-hubble-1.6.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/2.0.1) | [1.6.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.6.0/hugegraph-tools-1.6.0.tar.gz) | +| [0.11.2](https://github.com/apache/incubator-hugegraph/releases/download/v0.11.2/hugegraph-0.11.2.tar.gz) | [1.9.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.9.1) | [0.11.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.11.1/hugegraph-loader-0.11.1.tar.gz) | [1.5.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.5.0/hugegraph-hubble-1.5.0.tar.gz) | [1.8.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.8.1) | [1.5.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.5.0/hugegraph-tools-1.5.0.tar.gz) | +| [0.10.4](https://github.com/apache/incubator-hugegraph/releases/download/v0.10.4/hugegraph-0.10.4.tar.gz) | [1.8.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.8.0) | [0.10.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.10.1/hugegraph-loader-0.10.1.tar.gz) | [0.10.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.10.0/hugegraph-studio-0.10.0.tar.gz) | [1.6.16](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.16) | [1.4.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.4.0/hugegraph-tools-1.4.0.tar.gz) | +| [0.9.2](https://github.com/apache/incubator-hugegraph/releases/download/v0.9.2/hugegraph-0.9.2.tar.gz) | [1.7.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.7.0) | [0.9.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.9.0/hugegraph-loader-0.9.0.tar.gz) | [0.9.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.9.0/hugegraph-studio-0.9.0.tar.gz) | [1.6.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.0) | [1.3.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.3.0/hugegraph-tools-1.3.0.tar.gz) | +| [0.8.0](https://github.com/apache/incubator-hugegraph/releases/download/v0.8.0/hugegraph-0.8.0.tar.gz) | [1.6.4](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.6.4) | [0.8.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.8.0/hugegraph-loader-0.8.0.tar.gz) | [0.8.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.8.0/hugegraph-studio-0.8.0.tar.gz) | [1.5.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.5.3) | [1.2.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.2.0/hugegraph-tools-1.2.0.tar.gz) | +| [0.7.4](https://github.com/apache/incubator-hugegraph/releases/download/v0.7.4/hugegraph-0.7.4.tar.gz) | [1.5.8](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.8) | [0.7.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.7.0/hugegraph-loader-0.7.0.tar.gz) | [0.7.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.7.0/hugegraph-studio-0.7.0.tar.gz) | [1.4.9](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.9) | [1.1.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.1.0/hugegraph-tools-1.1.0.tar.gz) | +| [0.6.1](https://github.com/apache/incubator-hugegraph/releases/download/v0.6.1/hugegraph-0.6.1.tar.gz) | [1.5.6](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.6) | [0.6.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.6.1/hugegraph-loader-0.6.1.tar.gz) | [0.6.1](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.6.1/hugegraph-studio-0.6.1.tar.gz) | [1.4.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.3) | [1.0.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.0.0/hugegraph-tools-1.0.0.tar.gz) | +| [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.5.6-SNAPSHOT.tar.gz) | [1.5.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.0) | [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.5.6-bin.tar.gz) | [0.5.0](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.5.0-SNAPSHOT.tar.gz) | 1.4.0 | | +| [0.4.5](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.4.5-SNAPSHOT.tar.gz) | [1.4.7](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.4.7) | [0.2.2](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.2.2-bin.tar.gz) | [0.4.1](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.4.1-SNAPSHOT.tar.gz) | 1.3.12 | | > 说明:最新的图分析和展示平台为 hubble,支持 0.10 及之后的 server 版本;studio 为 server 0.10.x 以及之前的版本的图分析和展示平台,其功能从 0.10 起不再更新。 diff --git "a/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" b/content/cn/docs/images/images-server/621swaggerui-set-auth-example.png similarity index 100% rename from "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\347\244\272\344\276\213.png" rename to content/cn/docs/images/images-server/621swaggerui-set-auth-example.png diff --git "a/content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" b/content/cn/docs/images/images-server/621swaggerui-where-set-auth-example.png similarity index 100% rename from "content/cn/docs/images/images-server/621swaggerui\350\256\276\347\275\256\351\211\264\346\235\203\344\275\215\347\275\256\347\244\272\344\276\213.jpg" rename to content/cn/docs/images/images-server/621swaggerui-where-set-auth-example.png diff --git a/content/cn/docs/quickstart/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph-server.md index a6753a0f4..a6b387d75 100644 --- a/content/cn/docs/quickstart/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph-server.md @@ -89,7 +89,7 @@ mvn package -DskipTests #### 3.3 使用 Docker 容器 (便于**测试**) -可参考 [Docker 部署方式](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/README.md)。 +可参考 [Docker 部署方式](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/README.md)。 我们可以使用 `docker run -itd --name=graph -p 8080:8080 hugegraph/hugegraph` 去快速启动一个内置了 `RocksDB` 的 `Hugegraph server`. @@ -442,7 +442,7 @@ Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)......OK 在使用 Docker 的时候,我们可以使用 Cassandra 作为后端存储。我们更加推荐直接使用 docker-compose 来对于 server 以及 Cassandra 进行统一管理 -样例的 `docker-compose.yml` 可以在 [github](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/docker/example/docker-compose-cassandra.yml) 中获取,使用 `docker-compose up -d` 启动。(如果使用 cassandra 4.0 版本作为后端存储,则需要大约两个分钟初始化,请耐心等待) +样例的 `docker-compose.yml` 可以在 [github](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/docker/example/docker-compose-cassandra.yml) 中获取,使用 `docker-compose up -d` 启动。(如果使用 cassandra 4.0 版本作为后端存储,则需要大约两个分钟初始化,请耐心等待) ```yaml version: "3" @@ -509,7 +509,7 @@ volumes: 2. 使用`docker-compose` - 创建`docker-compose.yml`,具体文件如下,在环境变量中设置 PRELOAD=true。其中,[`example.groovy`](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/src/assembly/static/scripts/example.groovy) 是一个预定义的脚本,用于预加载样例数据。如果有需要,可以通过挂载新的 `example.groovy` 脚本改变预加载的数据。 + 创建`docker-compose.yml`,具体文件如下,在环境变量中设置 PRELOAD=true。其中,[`example.groovy`](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/src/assembly/static/scripts/example.groovy) 是一个预定义的脚本,用于预加载样例数据。如果有需要,可以通过挂载新的 `example.groovy` 脚本改变预加载的数据。 ```yaml version: '3' @@ -656,13 +656,13 @@ _说明_ 在使用 Swagger UI 调试 HugeGraph 提供的 API 时,如果 HugeGraph Server 开启了鉴权模式,可以在 Swagger 页面输入鉴权信息。
- image + image
当前 HugeGraph 支持基于 Basic 和 Bearer 两种形式设置鉴权信息。
- image + image
### 7 停止 Server diff --git a/content/en/docs/contribution-guidelines/contribute.md b/content/en/docs/contribution-guidelines/contribute.md index ac9961435..32c434ca8 100644 --- a/content/en/docs/contribution-guidelines/contribute.md +++ b/content/en/docs/contribution-guidelines/contribute.md @@ -77,9 +77,9 @@ Note: In order to be consistent with the code style easily, if you use [IDEA](ht ##### 3.2.1 Check licenses If we want to add new third-party dependencies to the `HugeGraph` project, we need to do the following things: 1. Find the third-party dependent repository, put the dependent `license` file into [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) path. -2. Declare the dependency in [./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/LICENSE) `LICENSE` information. -3. Find the NOTICE file in the repository and append it to [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file). -4. Execute locally [./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/known-dependencies.txt) (or manually update) . +2. Declare the dependency in [./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) `LICENSE` information. +3. Find the NOTICE file in the repository and append it to [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file). +4. Execute locally [./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt) (or manually update) . **Example**: A new third-party dependency is introduced into the project -> `ant-1.9.1.jar` - The project source code is located at: https://github.com/apache/ant/tree/rel/1.9.1 diff --git a/content/en/docs/download/download.md b/content/en/docs/download/download.md index ac296fcbf..695ba15d2 100644 --- a/content/en/docs/download/download.md +++ b/content/en/docs/download/download.md @@ -31,16 +31,18 @@ The latest HugeGraph: **1.0.0**, released on _2023-02-22_([how to build from sou ### Outdated Versions Mapping -| server | client | loader | hubble | common | tools | -| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| [0.12.0](https://github.com/hugegraph/hugegraph/releases/download/v0.12.0/hugegraph-0.12.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/2.0.1) | [0.12.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.12.0/hugegraph-loader-0.12.0.tar.gz) | [1.6.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.6.0/hugegraph-hubble-1.6.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/2.0.1) | [1.6.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.6.0/hugegraph-tools-1.6.0.tar.gz) | -| [0.11.2](https://github.com/hugegraph/hugegraph/releases/download/v0.11.2/hugegraph-0.11.2.tar.gz) | [1.9.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.9.1) | [0.11.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.11.1/hugegraph-loader-0.11.1.tar.gz) | [1.5.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.5.0/hugegraph-hubble-1.5.0.tar.gz) | [1.8.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.8.1) | [1.5.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.5.0/hugegraph-tools-1.5.0.tar.gz) | -| [0.10.4](https://github.com/hugegraph/hugegraph/releases/download/v0.10.4/hugegraph-0.10.4.tar.gz) | [1.8.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.8.0) | [0.10.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.10.1/hugegraph-loader-0.10.1.tar.gz) | [0.10.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.10.0/hugegraph-studio-0.10.0.tar.gz) | [1.6.16](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.16) | [1.4.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.4.0/hugegraph-tools-1.4.0.tar.gz) | -| [0.9.2](https://github.com/hugegraph/hugegraph/releases/download/v0.9.2/hugegraph-0.9.2.tar.gz) | [1.7.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.7.0) | [0.9.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.9.0/hugegraph-loader-0.9.0.tar.gz) | [0.9.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.9.0/hugegraph-studio-0.9.0.tar.gz) | [1.6.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.0) | [1.3.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.3.0/hugegraph-tools-1.3.0.tar.gz) | -| [0.8.0](https://github.com/hugegraph/hugegraph/releases/download/v0.8.0/hugegraph-0.8.0.tar.gz) | [1.6.4](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.6.4) | [0.8.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.8.0/hugegraph-loader-0.8.0.tar.gz) | [0.8.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.8.0/hugegraph-studio-0.8.0.tar.gz) | [1.5.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.5.3) | [1.2.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.2.0/hugegraph-tools-1.2.0.tar.gz) | -| [0.7.4](https://github.com/hugegraph/hugegraph/releases/download/v0.7.4/hugegraph-0.7.4.tar.gz) | [1.5.8](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.8) | [0.7.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.7.0/hugegraph-loader-0.7.0.tar.gz) | [0.7.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.7.0/hugegraph-studio-0.7.0.tar.gz) | [1.4.9](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.9) | [1.1.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.1.0/hugegraph-tools-1.1.0.tar.gz) | -| [0.6.1](https://github.com/hugegraph/hugegraph/releases/download/v0.6.1/hugegraph-0.6.1.tar.gz) | [1.5.6](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.6) | [0.6.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.6.1/hugegraph-loader-0.6.1.tar.gz) | [0.6.1](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.6.1/hugegraph-studio-0.6.1.tar.gz) | [1.4.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.3) | [1.0.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.0.0/hugegraph-tools-1.0.0.tar.gz) | -| [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.5.6-SNAPSHOT.tar.gz) | [1.5.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.0) | [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.5.6-bin.tar.gz) | [0.5.0](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.5.0-SNAPSHOT.tar.gz) | 1.4.0 | | -| [0.4.5](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.4.5-SNAPSHOT.tar.gz) | [1.4.7](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.4.7) | [0.2.2](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.2.2-bin.tar.gz) | [0.4.1](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.4.1-SNAPSHOT.tar.gz) | 1.3.12 | | +For versions before 1.0.0 (i.e. non ASF versions), the HugeGraph community will no longer maintain them. + +| server | client | loader | hubble | common | tools | +|-----------------------------------------------------------------------------------------------------------| -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | +| [0.12.0](https://github.com/apache/incubator-hugegraph/releases/download/v0.12.0/hugegraph-0.12.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/2.0.1) | [0.12.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.12.0/hugegraph-loader-0.12.0.tar.gz) | [1.6.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.6.0/hugegraph-hubble-1.6.0.tar.gz) | [2.0.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/2.0.1) | [1.6.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.6.0/hugegraph-tools-1.6.0.tar.gz) | +| [0.11.2](https://github.com/apache/incubator-hugegraph/releases/download/v0.11.2/hugegraph-0.11.2.tar.gz) | [1.9.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.9.1) | [0.11.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.11.1/hugegraph-loader-0.11.1.tar.gz) | [1.5.0](https://github.com/hugegraph/hugegraph-hubble/releases/download/v1.5.0/hugegraph-hubble-1.5.0.tar.gz) | [1.8.1](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.8.1) | [1.5.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.5.0/hugegraph-tools-1.5.0.tar.gz) | +| [0.10.4](https://github.com/apache/incubator-hugegraph/releases/download/v0.10.4/hugegraph-0.10.4.tar.gz) | [1.8.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.8.0) | [0.10.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.10.1/hugegraph-loader-0.10.1.tar.gz) | [0.10.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.10.0/hugegraph-studio-0.10.0.tar.gz) | [1.6.16](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.16) | [1.4.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.4.0/hugegraph-tools-1.4.0.tar.gz) | +| [0.9.2](https://github.com/apache/incubator-hugegraph/releases/download/v0.9.2/hugegraph-0.9.2.tar.gz) | [1.7.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.7.0) | [0.9.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.9.0/hugegraph-loader-0.9.0.tar.gz) | [0.9.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.9.0/hugegraph-studio-0.9.0.tar.gz) | [1.6.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.6.0) | [1.3.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.3.0/hugegraph-tools-1.3.0.tar.gz) | +| [0.8.0](https://github.com/apache/incubator-hugegraph/releases/download/v0.8.0/hugegraph-0.8.0.tar.gz) | [1.6.4](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.6.4) | [0.8.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.8.0/hugegraph-loader-0.8.0.tar.gz) | [0.8.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.8.0/hugegraph-studio-0.8.0.tar.gz) | [1.5.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.5.3) | [1.2.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.2.0/hugegraph-tools-1.2.0.tar.gz) | +| [0.7.4](https://github.com/apache/incubator-hugegraph/releases/download/v0.7.4/hugegraph-0.7.4.tar.gz) | [1.5.8](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.8) | [0.7.0](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.7.0/hugegraph-loader-0.7.0.tar.gz) | [0.7.0](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.7.0/hugegraph-studio-0.7.0.tar.gz) | [1.4.9](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.9) | [1.1.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.1.0/hugegraph-tools-1.1.0.tar.gz) | +| [0.6.1](https://github.com/apache/incubator-hugegraph/releases/download/v0.6.1/hugegraph-0.6.1.tar.gz) | [1.5.6](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.6) | [0.6.1](https://github.com/hugegraph/hugegraph-loader/releases/download/v0.6.1/hugegraph-loader-0.6.1.tar.gz) | [0.6.1](https://github.com/hugegraph/hugegraph-studio/releases/download/v0.6.1/hugegraph-studio-0.6.1.tar.gz) | [1.4.3](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-common/1.4.3) | [1.0.0](https://github.com/hugegraph/hugegraph-tools/releases/download/v1.0.0/hugegraph-tools-1.0.0.tar.gz) | +| [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.5.6-SNAPSHOT.tar.gz) | [1.5.0](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.5.0) | [0.5.6](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.5.6-bin.tar.gz) | [0.5.0](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.5.0-SNAPSHOT.tar.gz) | 1.4.0 | | +| [0.4.5](https://hugegraph.github.io/hugegraph-downloads/hugegraph-release-0.4.5-SNAPSHOT.tar.gz) | [1.4.7](https://mvnrepository.com/artifact/com.baidu.hugegraph/hugegraph-client/1.4.7) | [0.2.2](https://hugegraph.github.io/hugegraph-downloads/hugegraph-loader/hugegraph-loader-0.2.2-bin.tar.gz) | [0.4.1](https://hugegraph.github.io/hugegraph-downloads/hugegraph-studio/hugestudio-release-0.4.1-SNAPSHOT.tar.gz) | 1.3.12 | | > Note: The latest graph analysis and display platform is Hubble, which supports server v0.10 +. diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 4e14d0dc0..77cbd45a0 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -454,7 +454,7 @@ In [3.3 Use Docker container](#33-use-docker-container), we have introduced how When using Docker, we can use Cassandra as the backend storage. We highly recommend using docker-compose directly to manage both the server and Cassandra. -The sample `docker-compose.yml` can be obtained on [github](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/docker/example/docker-compose-cassandra.yml), and you can start it with `docker-compose up -d`. (If using Cassandra 4.0 as the backend storage, it takes approximately two minutes to initialize. Please be patient.) +The sample `docker-compose.yml` can be obtained on [github](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/docker/example/docker-compose-cassandra.yml), and you can start it with `docker-compose up -d`. (If using Cassandra 4.0 as the backend storage, it takes approximately two minutes to initialize. Please be patient.) ```yaml version: "3" @@ -521,7 +521,7 @@ Set the environment variable `PRELOAD=true` when starting Docker in order to loa 2. Use `docker-compose` - Create `docker-compose.yml` as following. We should set the environment variable `PRELOAD=true`. [`example.groovy`](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/src/assembly/static/scripts/example.groovy) is a predefined script to preload the sample data. If needed, we can mount a new `example.groovy` to change the preload data. + Create `docker-compose.yml` as following. We should set the environment variable `PRELOAD=true`. [`example.groovy`](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/src/assembly/static/scripts/example.groovy) is a predefined script to preload the sample data. If needed, we can mount a new `example.groovy` to change the preload data. ```yaml version: '3' @@ -666,13 +666,13 @@ You can also visit `localhost:8080/swagger-ui/index.html` to check the API. When using Swagger UI to debug the API provided by HugeGraph, if HugeGraph Server turns on authentication mode, you can enter authentication information on the Swagger page.
- image + image
Currently HugeGraph supports setting authentication information in two forms: Basic and Bearer.
- image + image
### 7 Stop Server From 617166853c745b67930175f5204d80696e1b1c8c Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Thu, 21 Dec 2023 22:16:40 +0800 Subject: [PATCH 10/19] chore(website): update outdated description --- .../contribution-guidelines/contribute.md | 2 +- .../validate-release.md | 39 +++++++++------- .../contribution-guidelines/contribute.md | 2 +- .../validate-release.md | 45 +++++++++++-------- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/content/cn/docs/contribution-guidelines/contribute.md b/content/cn/docs/contribution-guidelines/contribute.md index 1681da95a..05b6a598a 100644 --- a/content/cn/docs/contribution-guidelines/contribute.md +++ b/content/cn/docs/contribution-guidelines/contribute.md @@ -79,7 +79,7 @@ Note: In order to be consistent with the code style easily, if you use [IDEA](ht ##### 3.2.1 添加第三方依赖 如果我们要在 `HugeGraph` 项目中添加新的第三方依赖, 我们需要做下面的几件事情: -1. 找到第三方依赖的仓库,将依赖的 `license` 文件放到 [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) 路径下。 +1. 找到第三方依赖的仓库,将依赖的 `license` 文件放到 [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-server/hugegraph-dist/release-docs/licenses) 路径下。 2. 在[./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) 中声明该依赖的 `LICENSE` 信息。 3. 找到仓库里的 NOTICE 文件,将其追加到 [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) 文件后面(如果没有NOTICE文件则跳过这一步)。 4. 本地执行[./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) 脚本来更新依赖列表[known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt) (或者手动更新)。 diff --git a/content/cn/docs/contribution-guidelines/validate-release.md b/content/cn/docs/contribution-guidelines/validate-release.md index ef51792f4..dd99dbdde 100644 --- a/content/cn/docs/contribution-guidelines/validate-release.md +++ b/content/cn/docs/contribution-guidelines/validate-release.md @@ -37,10 +37,10 @@ sudo apt-get install wget -y # MacOS brew install wget -# 4. 下载 hugegraph-svn 目录 (版本号注意填写此次验证版本, 这里以1.0.0为例) -svn co https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.0.0/ +# 4. 下载 hugegraph-svn 目录 (版本号注意填写此次验证版本) +svn co https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/ # (注) 如果出现 svn 下载某个文件速度很慢的情况, 可以考虑 wget 单个文件下载, 如下 (或考虑使用 VPN / 代理) -wget https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.0.0/apache-hugegraph-toolchain-incubating-1.0.0.tar.gz +wget https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/apache-hugegraph-toolchain-incubating-1.x.x.tar.gz ``` #### 2. 检查 hash 值 @@ -137,9 +137,6 @@ bin/hugegraph-loader.sh -f path -g graph -s schema # hugegraph-hubble bin/start-hubble.sh -# hugegraph-computer -bin/start-computer.sh -d local -r master - 更多参考官网: https://hugegraph.apache.org/cn/docs/quickstart ``` @@ -158,11 +155,16 @@ bin/start-computer.sh -d local -r master ```markdown +1 (non-binding) I checked: -1. All download links are valid -2. Checksum and signature are OK -3. LICENSE and NOTICE are exist -4. Build successfully on macOS(Big Sur) -5. .... +1.Download link/tag in mail are valid +2.Checksum and GPG signatures are OK +3.LICENSE & NOTICE & DISCLAIMER are exist +4.Build successfully on Ubuntu22.04 & MacOS 14.2 +5.No unexpected binary files +6.Date is right in the NOTICE file +7.Compile from source is fine under Java11 +8.No empty file & directory found +9.Running server/loader/hubble process OK +10. .... ``` 特别注意 PMC 成员必须使用 `binding` 标记回复邮件, 这对于统计有效投票很重要; @@ -170,10 +172,15 @@ I checked: ```markdown +1 (binding) I checked: -1. All download links are valid -2. Checksum and signature are OK -3. LICENSE and NOTICE are exist -4. Build successfully on macOS(Big Sur) -5. .... +1.Download link/tag in mail are valid +2.Checksum and GPG signatures are OK +3.LICENSE & NOTICE & DISCLAIMER are exist +4.Build successfully on Ubuntu22.04 & MacOS 14.2 +5.No unexpected binary files +6.Date is right in the NOTICE file +7.Compile from source is fine under Java11 +8.No empty file & directory found +9.Running server/loader/hubble process OK +10. .... ``` diff --git a/content/en/docs/contribution-guidelines/contribute.md b/content/en/docs/contribution-guidelines/contribute.md index 32c434ca8..e8741b1f4 100644 --- a/content/en/docs/contribution-guidelines/contribute.md +++ b/content/en/docs/contribution-guidelines/contribute.md @@ -76,7 +76,7 @@ Note: In order to be consistent with the code style easily, if you use [IDEA](ht ##### 3.2.1 Check licenses If we want to add new third-party dependencies to the `HugeGraph` project, we need to do the following things: -1. Find the third-party dependent repository, put the dependent `license` file into [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) path. +1. Find the third-party dependent repository, put the dependent `license` file into [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-server/hugegraph-dist/release-docs/licenses) path. 2. Declare the dependency in [./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) `LICENSE` information. 3. Find the NOTICE file in the repository and append it to [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file). 4. Execute locally [./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt) (or manually update) . diff --git a/content/en/docs/contribution-guidelines/validate-release.md b/content/en/docs/contribution-guidelines/validate-release.md index ddf5fd3da..3d5225e42 100644 --- a/content/en/docs/contribution-guidelines/validate-release.md +++ b/content/en/docs/contribution-guidelines/validate-release.md @@ -36,10 +36,12 @@ sudo apt-get install wget -y # MacOS brew install wget -# 4. Download the hugegraph-svn directory (version number, pay attention to fill in the verification version, here we take 1.0.0 as an example) -svn co https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.0.0/ -# (Note) If svn downloads a file very slowly, you can consider wget to download a single file, as follows (or consider using a proxy) -wget https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.0.0/apache-hugegraph-toolchain-incubating-1.0.0.tar.gz +# 4. Download the hugegraph-svn directory +# For version number, pay attention to fill in the verification version +svn co https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/ +# (Note) If svn downloads a file very slowly, +# you can consider wget to download a single file, as follows (or consider using a proxy) +wget https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/apache-hugegraph-toolchain-incubating-1.x.x.tar.gz ``` #### 2. check hash value @@ -136,10 +138,7 @@ bin/hugegraph-loader.sh -f path -g graph -s schema # hugegraph-hubble bin/start-hubble.sh -# hugegraph-computer -bin/start-computer.sh -d local -r master - -more reference official website: https://hugegraph.apache.org/cn/docs/quickstart +more reference official website: https://hugegraph.apache.org/docs/quickstart ``` **Note:** If a third-party dependency is introduced in the binary package, you need to update the LICENSE and add the third-party dependent LICENSE; if the third-party dependent LICENSE is Apache 2.0, and the corresponding project contains NOTICE, you also need to update Our NOTICE file @@ -156,21 +155,31 @@ After the check & test, you should reply the mail with the following content: (n ```markdown +1 (non-binding) I checked: -1. All download links are valid -2. Checksum and signature are OK -3. LICENSE and NOTICE are exist -4. Build successfully on macOS(Big Sur) -5. .... +1.Download link/tag in mail are valid +2.Checksum and GPG signatures are OK +3.LICENSE & NOTICE & DISCLAIMER are exist +4.Build successfully on Ubuntu22.04 & MacOS 14.2 +5.No unexpected binary files +6.Date is right in the NOTICE file +7.Compile from source is fine under Java11 +8.No empty file & directory found +9.Running server/loader/hubble process OK +10. .... ``` and the PMC members should reply with `binding`, it's important for summary the valid votes: ```markdown +1 (binding) I checked: -1. All download links are valid -2. Checksum and signature are OK -3. LICENSE and NOTICE are exist -4. Build successfully on macOS(Big Sur) -5. .... +1.Download link/tag in mail are valid +2.Checksum and GPG signatures are OK +3.LICENSE & NOTICE & DISCLAIMER are exist +4.Build successfully on Ubuntu22.04 & MacOS 14.2 +5.No unexpected binary files +6.Date is right in the NOTICE file +7.Compile from source is fine under Java11 +8.No empty file & directory found +9.Running server/loader/hubble process OK +10. .... ``` From ecfe7fcfdca24e9926222b8e1796b8388d17a032 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Thu, 21 Dec 2023 22:17:58 +0800 Subject: [PATCH 11/19] chore(website): update outdated description --- content/en/docs/contribution-guidelines/validate-release.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/en/docs/contribution-guidelines/validate-release.md b/content/en/docs/contribution-guidelines/validate-release.md index 3d5225e42..aba6929ee 100644 --- a/content/en/docs/contribution-guidelines/validate-release.md +++ b/content/en/docs/contribution-guidelines/validate-release.md @@ -69,7 +69,8 @@ gpg: key 28DCAED849C4180E: public key "coderzc (CODE SIGNING KEY) trust ...output options.. From 44211f390dcd022d7d9878eca35e09f8b8477031 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Thu, 21 Dec 2023 22:23:36 +0800 Subject: [PATCH 12/19] chore(website): update outdated description --- .../cn/docs/contribution-guidelines/validate-release.md | 6 ++++++ .../en/docs/contribution-guidelines/validate-release.md | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/content/cn/docs/contribution-guidelines/validate-release.md b/content/cn/docs/contribution-guidelines/validate-release.md index dd99dbdde..92be2828a 100644 --- a/content/cn/docs/contribution-guidelines/validate-release.md +++ b/content/cn/docs/contribution-guidelines/validate-release.md @@ -151,7 +151,13 @@ bin/start-hubble.sh ## 邮件模板 检查完成后, 你应该按不同角色回复邮件: (普通开发者 & PMC 成员) +```markdown +[] +1 同意 + +[] +0 没有意见 +[] -1 不同意,并注明原因 +``` ```markdown +1 (non-binding) I checked: diff --git a/content/en/docs/contribution-guidelines/validate-release.md b/content/en/docs/contribution-guidelines/validate-release.md index aba6929ee..0af45d25e 100644 --- a/content/en/docs/contribution-guidelines/validate-release.md +++ b/content/en/docs/contribution-guidelines/validate-release.md @@ -153,6 +153,15 @@ more reference official website: https://hugegraph.apache.org/docs/quickstart ## Mail Template After the check & test, you should reply the mail with the following content: (normal devs & PMC) + +```markdown +[] +1 approve + +[] +0 no opinion + +[] -1 disapprove with the reason +``` + ```markdown +1 (non-binding) I checked: From 0f26ec7397c569cd8e36b8eaf53a3edd612b18b2 Mon Sep 17 00:00:00 2001 From: imbajin Date: Thu, 21 Dec 2023 23:51:37 +0800 Subject: [PATCH 13/19] Apply suggestions from code review --- .../validate-release.md | 18 +++++++++--------- .../validate-release.md | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/content/cn/docs/contribution-guidelines/validate-release.md b/content/cn/docs/contribution-guidelines/validate-release.md index 92be2828a..cae42194d 100644 --- a/content/cn/docs/contribution-guidelines/validate-release.md +++ b/content/cn/docs/contribution-guidelines/validate-release.md @@ -152,11 +152,11 @@ bin/start-hubble.sh 检查完成后, 你应该按不同角色回复邮件: (普通开发者 & PMC 成员) ```markdown -[] +1 同意 +[] +1 approve -[] +0 没有意见 +[] +0 no opinion -[] -1 不同意,并注明原因 +[] -1 disapprove with the reason ``` ```markdown +1 (non-binding) @@ -164,12 +164,12 @@ I checked: 1.Download link/tag in mail are valid 2.Checksum and GPG signatures are OK 3.LICENSE & NOTICE & DISCLAIMER are exist -4.Build successfully on Ubuntu22.04 & MacOS 14.2 +4.Build successfully on XX OS version XXX 5.No unexpected binary files 6.Date is right in the NOTICE file -7.Compile from source is fine under Java11 +7.Compile from source is fine under JavaX 8.No empty file & directory found -9.Running server/loader/hubble process OK +9. Test running xxx service OK 10. .... ``` @@ -181,12 +181,12 @@ I checked: 1.Download link/tag in mail are valid 2.Checksum and GPG signatures are OK 3.LICENSE & NOTICE & DISCLAIMER are exist -4.Build successfully on Ubuntu22.04 & MacOS 14.2 +4.Build successfully on XX OS Version XX 5.No unexpected binary files 6.Date is right in the NOTICE file -7.Compile from source is fine under Java11 +7.Compile from source is fine under JavaXX 8.No empty file & directory found -9.Running server/loader/hubble process OK +9. Test running XXX service OK 10. .... ``` diff --git a/content/en/docs/contribution-guidelines/validate-release.md b/content/en/docs/contribution-guidelines/validate-release.md index 0af45d25e..d20bfa386 100644 --- a/content/en/docs/contribution-guidelines/validate-release.md +++ b/content/en/docs/contribution-guidelines/validate-release.md @@ -70,7 +70,7 @@ gpg: Total number processed: 3 gpg: imported: 3 # 2. Trust release users (trust n username mentioned in voting mail, if more than one user, -# just repeat the steps in turn or use the script below) +# just repeat the steps in turn or use the script below) gpg --edit-key $USER # input the username, enter the interactive mode gpg> trust ...output options.. @@ -168,12 +168,12 @@ I checked: 1.Download link/tag in mail are valid 2.Checksum and GPG signatures are OK 3.LICENSE & NOTICE & DISCLAIMER are exist -4.Build successfully on Ubuntu22.04 & MacOS 14.2 +4.Build successfully on XX OS & Version XX 5.No unexpected binary files 6.Date is right in the NOTICE file -7.Compile from source is fine under Java11 +7.Compile from source is fine under JavaXX 8.No empty file & directory found -9.Running server/loader/hubble process OK +9. Test running XXX service OK 10. .... ``` @@ -184,12 +184,12 @@ I checked: 1.Download link/tag in mail are valid 2.Checksum and GPG signatures are OK 3.LICENSE & NOTICE & DISCLAIMER are exist -4.Build successfully on Ubuntu22.04 & MacOS 14.2 +4.Build successfully on XX OS & Version XX 5.No unexpected binary files 6.Date is right in the NOTICE file -7.Compile from source is fine under Java11 +7.Compile from source is fine under JavaXX 8.No empty file & directory found -9.Running server/loader/hubble process OK +9. Test running XX process OK 10. .... ``` From 3103f967711b5130aae5b8c701f1599bb15dff8e Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Wed, 27 Dec 2023 00:17:19 +0800 Subject: [PATCH 14/19] chore(website): update auth mode description --- .../cn/docs/quickstart/hugegraph-server.md | 27 +++++++++++++++++++ .../en/docs/quickstart/hugegraph-server.md | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/content/cn/docs/quickstart/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph-server.md index a6b387d75..6cd84f9e7 100644 --- a/content/cn/docs/quickstart/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph-server.md @@ -112,6 +112,19 @@ services: - 8080:8080 ``` +在 docker 部署模式下,如果想要使用 HugeGraph 鉴权模式,需要在进入容器停止 HugeGraph 后,删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 + +```bash +bin/stop-hugegraph.sh + +rm -rf rocksdb-data/ + +bin/init-store.sh + +bin/start-hugegraph.sh + +``` + > 注意: > > 1. hugegraph 的 docker 镜像是一个便捷版本,用于快速启动 hugegraph,并不是**官方发布物料包方式**。你可以从 [ASF Release Distribution Policy](https://infra.apache.org/release-distribution.html#dockerhub) 中得到更多细节。 @@ -160,6 +173,20 @@ HugeGraphServer 启动时会连接后端存储并尝试检查后端存储版本 由于各种后端所需的配置(hugegraph.properties)及启动步骤略有不同,下面逐一对各后端的配置及启动做介绍。 +如果想要使用 HugeGraph 鉴权模式,在后面正式启动 HugeGraph 之前应按照 [HugeGraph 鉴权配置](https://hugegraph.apache.org/cn/docs/config/config-authentication/) 进行配置 + +如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 + +```bash +bin/stop-hugegraph.sh + +rm -rf rocksdb-data/ + +bin/init-store.sh + +bin/start-hugegraph.sh + +``` ##### 5.1.1 RocksDB
diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 77cbd45a0..1cb602630 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -121,6 +121,18 @@ services: ports: - 8080:8080 ``` +In docker deployment mode, if you want to use HugeGraph authentication mode, you need to enter the container to stop HugeGraph, then delete the related graph data and restart HugeGraph. if the graph already has business data, you can't switch the authentication mode, the support for this feature will be supported in the next release. + +```bash +bin/stop-hugegraph.sh + +rm -rf rocksdb-data/ + +bin/init-store.sh + +bin/start-hugegraph.sh + +``` > Note: > @@ -173,6 +185,21 @@ If you need to access HugeGraphServer externally, please modify the `restserver. Since the configuration (hugegraph.properties) and startup steps required by various backends are slightly different, the following will introduce the configuration and startup of each backend one by one. +If you want to use HugeGraph authentication mode, you should follow the [HugeGraph Authentication Configuration](https://hugegraph.apache.org/cn/docs/config/config-authentication/) configuration before you start HugeGraph later. + +如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 + +If you have initialized HugeGraph and need to convert to the authentication mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert to the authentication mode, the support for this feature will be supported in the next release. +```bash +bin/stop-hugegraph.sh + +rm -rf rocksdb-data/ + +bin/init-store.sh + +bin/start-hugegraph.sh + +``` ##### 5.1.1 Memory
From 3667773eb275eddfa03627fc4325caf3ed670fbb Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Wed, 27 Dec 2023 22:18:05 +0800 Subject: [PATCH 15/19] chore(website): update install description --- content/cn/docs/quickstart/hugegraph-server.md | 8 ++++++++ content/en/docs/quickstart/hugegraph-server.md | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/content/cn/docs/quickstart/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph-server.md index 6cd84f9e7..d29cf3190 100644 --- a/content/cn/docs/quickstart/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph-server.md @@ -115,12 +115,16 @@ services: 在 docker 部署模式下,如果想要使用 HugeGraph 鉴权模式,需要在进入容器停止 HugeGraph 后,删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 ```bash +# stop the hugeGraph firstly bin/stop-hugegraph.sh +# delete the store data rm -rf rocksdb-data/ +# init store again bin/init-store.sh +# start hugeGraph again bin/start-hugegraph.sh ``` @@ -178,12 +182,16 @@ HugeGraphServer 启动时会连接后端存储并尝试检查后端存储版本 如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 ```bash +# stop the hugeGraph firstly bin/stop-hugegraph.sh +# delete the store data rm -rf rocksdb-data/ +# init store again bin/init-store.sh +# start hugeGraph again bin/start-hugegraph.sh ``` diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 1cb602630..52b1c7c0d 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -124,12 +124,16 @@ services: In docker deployment mode, if you want to use HugeGraph authentication mode, you need to enter the container to stop HugeGraph, then delete the related graph data and restart HugeGraph. if the graph already has business data, you can't switch the authentication mode, the support for this feature will be supported in the next release. ```bash +# stop the hugeGraph firstly bin/stop-hugegraph.sh +# delete the store data rm -rf rocksdb-data/ +# init store again bin/init-store.sh +# start hugeGraph again bin/start-hugegraph.sh ``` @@ -191,12 +195,16 @@ If you want to use HugeGraph authentication mode, you should follow the [HugeGra If you have initialized HugeGraph and need to convert to the authentication mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert to the authentication mode, the support for this feature will be supported in the next release. ```bash +# stop the hugeGraph firstly bin/stop-hugegraph.sh +# delete the store data rm -rf rocksdb-data/ +# init store again bin/init-store.sh +# start hugeGraph again bin/start-hugegraph.sh ``` From 3496ae1569dc41bf2a7811b68659e98dd265a4c9 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Mon, 1 Jan 2024 13:00:37 +0800 Subject: [PATCH 16/19] chore(website): update outdated description --- content/cn/docs/quickstart/hugegraph-server.md | 10 +++++----- content/en/docs/quickstart/hugegraph-server.md | 11 +++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/content/cn/docs/quickstart/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph-server.md index d29cf3190..86653523f 100644 --- a/content/cn/docs/quickstart/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph-server.md @@ -112,13 +112,13 @@ services: - 8080:8080 ``` -在 docker 部署模式下,如果想要使用 HugeGraph 鉴权模式,需要在进入容器停止 HugeGraph 后,删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 +在 docker 部署模式下,如果想要使用 HugeGraph 鉴权模式,需要在进入容器停止 HugeGraph 后,删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 ```bash # stop the hugeGraph firstly bin/stop-hugegraph.sh -# delete the store data +# delete the store data (here we use the default path for rocksdb) rm -rf rocksdb-data/ # init store again @@ -177,15 +177,15 @@ HugeGraphServer 启动时会连接后端存储并尝试检查后端存储版本 由于各种后端所需的配置(hugegraph.properties)及启动步骤略有不同,下面逐一对各后端的配置及启动做介绍。 -如果想要使用 HugeGraph 鉴权模式,在后面正式启动 HugeGraph 之前应按照 [HugeGraph 鉴权配置](https://hugegraph.apache.org/cn/docs/config/config-authentication/) 进行配置 +如果想要使用 HugeGraph 鉴权模式,在后面正式启动 Server 之前应按照 [Server 鉴权配置](https://hugegraph.apache.org/cn/docs/config/config-authentication/) 进行配置。 -如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 +如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 ```bash # stop the hugeGraph firstly bin/stop-hugegraph.sh -# delete the store data +# delete the store data (here we use the default path for rocksdb) rm -rf rocksdb-data/ # init store again diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 52b1c7c0d..552390b8f 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -121,13 +121,12 @@ services: ports: - 8080:8080 ``` -In docker deployment mode, if you want to use HugeGraph authentication mode, you need to enter the container to stop HugeGraph, then delete the related graph data and restart HugeGraph. if the graph already has business data, you can't switch the authentication mode, the support for this feature will be supported in the next release. - +In docker deployment mode, if you want to use HugeGraph authentication mode, you need to enter the container to stop HugeGraph, delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert authentication mode directly for the time being (improvements/support for this feature will be released in the next version). ```bash # stop the hugeGraph firstly bin/stop-hugegraph.sh -# delete the store data +# delete the store data (here we use the default path for rocksdb) rm -rf rocksdb-data/ # init store again @@ -189,16 +188,16 @@ If you need to access HugeGraphServer externally, please modify the `restserver. Since the configuration (hugegraph.properties) and startup steps required by various backends are slightly different, the following will introduce the configuration and startup of each backend one by one. -If you want to use HugeGraph authentication mode, you should follow the [HugeGraph Authentication Configuration](https://hugegraph.apache.org/cn/docs/config/config-authentication/) configuration before you start HugeGraph later. +If you want to use HugeGraph authentication mode, you should follow the [Server Authentication Configuration](https://hugegraph.apache.org/cn/docs/config/config-authentication/) configuration before you start Server later. -如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,则无法转换鉴权模式,对于该功能的支持将在下个版本中支持。 +If HugeGraph has been initialized and needs to be converted to forensic mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't directly convert the forensic mode for the time being (improvements/support for this feature will be released in the next version). If you have initialized HugeGraph and need to convert to the authentication mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert to the authentication mode, the support for this feature will be supported in the next release. ```bash # stop the hugeGraph firstly bin/stop-hugegraph.sh -# delete the store data +# delete the store data (here we use the default path for rocksdb) rm -rf rocksdb-data/ # init store again From d758163373c725da5d20cc6bdd565d7b78ab3c09 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Mon, 1 Jan 2024 15:32:54 +0800 Subject: [PATCH 17/19] chore(website): update outdated description --- .../cn/docs/config/config-authentication.md | 20 +++++++++++ .../cn/docs/quickstart/hugegraph-server.md | 33 ------------------- .../en/docs/config/config-authentication.md | 18 ++++++++++ .../en/docs/quickstart/hugegraph-server.md | 32 ------------------ 4 files changed, 38 insertions(+), 65 deletions(-) diff --git a/content/cn/docs/config/config-authentication.md b/content/cn/docs/config/config-authentication.md index 4e41447ba..59fd48396 100644 --- a/content/cn/docs/config/config-authentication.md +++ b/content/cn/docs/config/config-authentication.md @@ -67,3 +67,23 @@ gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy ### 自定义用户认证系统 如果需要支持更加灵活的用户系统,可自定义 authenticator 进行扩展,自定义 authenticator 实现接口`org.apache.hugegraph.auth.HugeAuthenticator`即可,然后修改配置文件中`authenticator`配置项指向该实现。 + + +### 切换鉴权模式 + +如果已经初始化 HugeGraph 并需要转换为鉴权模式,需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 + +```bash +# stop the hugeGraph firstly +bin/stop-hugegraph.sh + +# delete the store data (here we use the default path for rocksdb) +rm -rf rocksdb-data/ + +# init store again +bin/init-store.sh + +# start hugeGraph again +bin/start-hugegraph.sh + +``` \ No newline at end of file diff --git a/content/cn/docs/quickstart/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph-server.md index 86653523f..9eaf26b21 100644 --- a/content/cn/docs/quickstart/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph-server.md @@ -112,23 +112,6 @@ services: - 8080:8080 ``` -在 docker 部署模式下,如果想要使用 HugeGraph 鉴权模式,需要在进入容器停止 HugeGraph 后,删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 - -```bash -# stop the hugeGraph firstly -bin/stop-hugegraph.sh - -# delete the store data (here we use the default path for rocksdb) -rm -rf rocksdb-data/ - -# init store again -bin/init-store.sh - -# start hugeGraph again -bin/start-hugegraph.sh - -``` - > 注意: > > 1. hugegraph 的 docker 镜像是一个便捷版本,用于快速启动 hugegraph,并不是**官方发布物料包方式**。你可以从 [ASF Release Distribution Policy](https://infra.apache.org/release-distribution.html#dockerhub) 中得到更多细节。 @@ -179,22 +162,6 @@ HugeGraphServer 启动时会连接后端存储并尝试检查后端存储版本 如果想要使用 HugeGraph 鉴权模式,在后面正式启动 Server 之前应按照 [Server 鉴权配置](https://hugegraph.apache.org/cn/docs/config/config-authentication/) 进行配置。 -如果已经初始化 HugeGraph 并需要转换为鉴权模式,则需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 - -```bash -# stop the hugeGraph firstly -bin/stop-hugegraph.sh - -# delete the store data (here we use the default path for rocksdb) -rm -rf rocksdb-data/ - -# init store again -bin/init-store.sh - -# start hugeGraph again -bin/start-hugegraph.sh - -``` ##### 5.1.1 RocksDB
diff --git a/content/en/docs/config/config-authentication.md b/content/en/docs/config/config-authentication.md index 3dbf046d7..588b63f9a 100644 --- a/content/en/docs/config/config-authentication.md +++ b/content/en/docs/config/config-authentication.md @@ -74,3 +74,21 @@ For detailed API calls and explanations regarding permissions, please refer to t If you need to support a more flexible user system, you can customize the authenticator for extension. Simply implement the `org.apache.hugegraph.auth.HugeAuthenticator` interface with your custom authenticator, and then modify the `authenticator` configuration item in the configuration file to point to your implementation. + +### Switching authentication mode + +If HugeGraph has already been initialized and needs to be converted to authentication mode, relevant graph data needs to be deleted and HugeGraph needs to be restarted. If there is already business data in the diagram, it is temporarily not possible to directly convert the authentication mode (improvements/support for this feature will be released in the next version). +```bash +# stop the hugeGraph firstly +bin/stop-hugegraph.sh + +# delete the store data (here we use the default path for rocksdb) +rm -rf rocksdb-data/ + +# init store again +bin/init-store.sh + +# start hugeGraph again +bin/start-hugegraph.sh + +``` \ No newline at end of file diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 552390b8f..36a430d7f 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -121,21 +121,6 @@ services: ports: - 8080:8080 ``` -In docker deployment mode, if you want to use HugeGraph authentication mode, you need to enter the container to stop HugeGraph, delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert authentication mode directly for the time being (improvements/support for this feature will be released in the next version). -```bash -# stop the hugeGraph firstly -bin/stop-hugegraph.sh - -# delete the store data (here we use the default path for rocksdb) -rm -rf rocksdb-data/ - -# init store again -bin/init-store.sh - -# start hugeGraph again -bin/start-hugegraph.sh - -``` > Note: > @@ -190,23 +175,6 @@ Since the configuration (hugegraph.properties) and startup steps required by var If you want to use HugeGraph authentication mode, you should follow the [Server Authentication Configuration](https://hugegraph.apache.org/cn/docs/config/config-authentication/) configuration before you start Server later. -If HugeGraph has been initialized and needs to be converted to forensic mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't directly convert the forensic mode for the time being (improvements/support for this feature will be released in the next version). - -If you have initialized HugeGraph and need to convert to the authentication mode, you need to delete the related graph data and restart HugeGraph. if the graph already has business data, you can't convert to the authentication mode, the support for this feature will be supported in the next release. -```bash -# stop the hugeGraph firstly -bin/stop-hugegraph.sh - -# delete the store data (here we use the default path for rocksdb) -rm -rf rocksdb-data/ - -# init store again -bin/init-store.sh - -# start hugeGraph again -bin/start-hugegraph.sh - -``` ##### 5.1.1 Memory
From ad684c27785185728e0392d309c9720926b2fcc2 Mon Sep 17 00:00:00 2001 From: 1289220708 <1289220708@qq.com> Date: Tue, 2 Jan 2024 00:43:52 +0800 Subject: [PATCH 18/19] chore(website): update outdated description --- content/cn/docs/config/config-authentication.md | 6 ++++-- content/en/docs/config/config-authentication.md | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/content/cn/docs/config/config-authentication.md b/content/cn/docs/config/config-authentication.md index 59fd48396..0bb3cf23d 100644 --- a/content/cn/docs/config/config-authentication.md +++ b/content/cn/docs/config/config-authentication.md @@ -69,9 +69,11 @@ gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy 如果需要支持更加灵活的用户系统,可自定义 authenticator 进行扩展,自定义 authenticator 实现接口`org.apache.hugegraph.auth.HugeAuthenticator`即可,然后修改配置文件中`authenticator`配置项指向该实现。 -### 切换鉴权模式 +### 基于鉴权模式启动 -如果已经初始化 HugeGraph 并需要转换为鉴权模式,需要删除相关图数据并重新启动 HugeGraph。若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 +在鉴权配置完成后,对于非 docker 部署模式,首次执行 init-store.sh 时支持在命令行输入 admin 账户密码。 + +如果基于 docker 镜像部署或者已经初始化 HugeGraph 并需要转换为鉴权模式,需要删除相关图数据并重新启动 HugeGraph,若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 ```bash # stop the hugeGraph firstly diff --git a/content/en/docs/config/config-authentication.md b/content/en/docs/config/config-authentication.md index 588b63f9a..fd5a41c10 100644 --- a/content/en/docs/config/config-authentication.md +++ b/content/en/docs/config/config-authentication.md @@ -77,7 +77,13 @@ and then modify the `authenticator` configuration item in the configuration file ### Switching authentication mode -If HugeGraph has already been initialized and needs to be converted to authentication mode, relevant graph data needs to be deleted and HugeGraph needs to be restarted. If there is already business data in the diagram, it is temporarily not possible to directly convert the authentication mode (improvements/support for this feature will be released in the next version). +After the authentication configuration is completed, for non Docker deployment modes, +it is supported to enter the admin account password on the command line when executing init store. sh for the first time. + +If deployed based on Docker image or if HugeGraph has already been initialized and needs to be converted to authentication mode, +relevant graph data needs to be deleted and HugeGraph needs to be restarted. If there is already business data in the diagram, +it is temporarily not possible to directly convert the authentication mode (improvements/support for this feature will be released in the next version). + ```bash # stop the hugeGraph firstly bin/stop-hugegraph.sh From bce9eb23052ed21128d4f4576b080b19d144bf3f Mon Sep 17 00:00:00 2001 From: imbajin Date: Tue, 2 Jan 2024 15:47:50 +0800 Subject: [PATCH 19/19] Apply suggestions from code review --- content/cn/docs/config/config-authentication.md | 4 ++-- content/en/docs/config/config-authentication.md | 5 ++--- content/en/docs/quickstart/hugegraph-server.md | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/content/cn/docs/config/config-authentication.md b/content/cn/docs/config/config-authentication.md index 0bb3cf23d..7c70daeff 100644 --- a/content/cn/docs/config/config-authentication.md +++ b/content/cn/docs/config/config-authentication.md @@ -71,9 +71,9 @@ gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy ### 基于鉴权模式启动 -在鉴权配置完成后,对于非 docker 部署模式,首次执行 init-store.sh 时支持在命令行输入 admin 账户密码。 +在鉴权配置完成后,需在首次执行 `init-store.sh` 时命令行中输入 `admin` 密码 (非 docker 部署模式下) -如果基于 docker 镜像部署或者已经初始化 HugeGraph 并需要转换为鉴权模式,需要删除相关图数据并重新启动 HugeGraph,若图已有业务数据,暂时无法直接转换鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 +如果基于 docker 镜像部署或者已经初始化 HugeGraph 并需要转换为鉴权模式,需要删除相关图数据并重新启动 HugeGraph,若图已有业务数据,暂时**无法直接转换**鉴权模式 (对于该功能的改进/支持将在下个版本中发布)。 ```bash # stop the hugeGraph firstly diff --git a/content/en/docs/config/config-authentication.md b/content/en/docs/config/config-authentication.md index fd5a41c10..7615daab9 100644 --- a/content/en/docs/config/config-authentication.md +++ b/content/en/docs/config/config-authentication.md @@ -77,12 +77,11 @@ and then modify the `authenticator` configuration item in the configuration file ### Switching authentication mode -After the authentication configuration is completed, for non Docker deployment modes, -it is supported to enter the admin account password on the command line when executing init store. sh for the first time. +After the authentication configuration completed, enter the **admin password** on the **command line** when executing `init store. sh` for the first time. (For non-Docker mode) If deployed based on Docker image or if HugeGraph has already been initialized and needs to be converted to authentication mode, relevant graph data needs to be deleted and HugeGraph needs to be restarted. If there is already business data in the diagram, -it is temporarily not possible to directly convert the authentication mode (improvements/support for this feature will be released in the next version). +it is temporarily **not possible** to directly convert the authentication mode (improvements/support for this feature will be released in the next version). ```bash # stop the hugeGraph firstly diff --git a/content/en/docs/quickstart/hugegraph-server.md b/content/en/docs/quickstart/hugegraph-server.md index 36a430d7f..2cd6631c9 100644 --- a/content/en/docs/quickstart/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph-server.md @@ -173,7 +173,7 @@ If you need to access HugeGraphServer externally, please modify the `restserver. Since the configuration (hugegraph.properties) and startup steps required by various backends are slightly different, the following will introduce the configuration and startup of each backend one by one. -If you want to use HugeGraph authentication mode, you should follow the [Server Authentication Configuration](https://hugegraph.apache.org/cn/docs/config/config-authentication/) configuration before you start Server later. +If you want to use HugeGraph authentication mode, you should follow the [Server Authentication Configuration](https://hugegraph.apache.org/docs/config/config-authentication/) configuration before you start Server later. ##### 5.1.1 Memory