Recon API
Recon API v1 是一组 HTTP 端点,可以帮助您了解 Ozone 集群的当前状态,并在需要时进行故障排除。
容器
GET /api/v1/containers
参数
-
prevKey (可选)
只回传ID大于给定的 prevKey 的容器。 示例:prevKey=1
-
limit (可选)
只回传有限数量的结果。默认限制是1000。
回传
回传所有 ContainerMetadata 对象。
{
"data": {
"totalCount": 3,
"containers": [
{
"ContainerID": 1,
"NumberOfKeys": 834
},
{
"ContainerID": 2,
"NumberOfKeys": 833
},
{
"ContainerID": 3,
"NumberOfKeys": 833
}
]
}
}
GET /api/v1/containers/:id/keys
参数
-
prevKey (可选)
只回传在给定的 prevKey 键前缀之后的键。 示例:prevKey=/vol1/bucket1/key1
-
limit (可选)
只回传有限数量的结果。默认限制是1000。
回传
回传给定容器 ID 的所有 KeyMetadata 对象。
{
"totalCount":7,
"keys": [
{
"Volume":"vol-1-73141",
"Bucket":"bucket-3-35816",
"Key":"key-0-43637",
"DataSize":1000,
"Versions":[0],
"Blocks": {
"0": [
{
"containerID":1,
"localID":105232659753992201
}
]
},
"CreationTime":"2020-11-18T18:09:17.722Z",
"ModificationTime":"2020-11-18T18:09:30.405Z"
},
...
]
}
GET /api/v1/containers/missing
参数
没有参数。
回传
回传所有丢失容器的 MissingContainerMetadata 对象。
{
"totalCount": 26,
"containers": [{
"containerID": 1,
"missingSince": 1605731029145,
"keys": 7,
"pipelineID": "88646d32-a1aa-4e1a",
"replicas": [{
"containerId": 1,
"datanodeHost": "localhost-1",
"firstReportTimestamp": 1605724047057,
"lastReportTimestamp": 1605731201301
},
...
]
},
...
]
}
GET /api/v1/containers/:id/replicaHistory
参数
没有参数。
回传 回传给定容器 ID 的所有 ContainerHistory 对象。
[
{
"containerId": 1,
"datanodeHost": "localhost-1",
"firstReportTimestamp": 1605724047057,
"lastReportTimestamp": 1605730421294
},
...
]
GET /api/v1/containers/unhealthy
参数
-
batchNum (可选) 回传结果的批号(如“页码”)。 传递1,将回传记录1到limit。传递2,将回传limit + 1到2 * limit,依此类推。
-
limit (可选)
只回传有限数量的结果。默认限制是1000。
回传
回传所有不健康容器的 UnhealthyContainerMetadata 对象。
{
"missingCount": 2,
"underReplicatedCount": 0,
"overReplicatedCount": 0,
"misReplicatedCount": 0,
"containers": [{
"containerID": 1,
"containerState": "MISSING",
"unhealthySince": 1605731029145,
"expectedReplicaCount": 3,
"actualReplicaCount": 0,
"replicaDeltaCount": 3,
"reason": null,
"keys": 7,
"pipelineID": "88646d32-a1aa-4e1a",
"replicas": [{
"containerId": 1,
"datanodeHost": "localhost-1",
"firstReportTimestamp": 1605722960125,
"lastReportTimestamp": 1605731230509
},
...
]
},
...
]
}
GET /api/v1/containers/unhealthy/:state
参数
-
batchNum (可选)
回传结果的批号(如“页码”)。 传递1,将回传记录1到limit。传递2,将回传limit + 1到2 * limit,依此类推。
-
limit (可选)
只回传有限数量的结果。默认限制是1000。
回传
回传处于给定状态的容器的 UnhealthyContainerMetadata 对象。
不健康的容器状态可能为MISSING
, MIS_REPLICATED
, UNDER_REPLICATED
,OVER_REPLICATED
。
响应结构与/containers/unhealthy
相同。
GET /api/v1/containers/mismatch
回传
回传 OM 和 SCM 之间不匹配容器的列表。
- 容器存在于 OM 中,但不存在于 SCM 中。
- 容器存在于 SCM 中,但不存在于 OM 中。
[
{
"containerId" : 1,
"numberOfKeys" : 3,
"pipelines" : [
"pipelineId" : "1423ghjds832403232",
"pipelineId" : "32vds94943fsdh4443",
"pipelineId" : "32vds94943fsdhs443"
],
"existsAt" : "OM"
}
...
]
GET /api/v1/containers/mismatch/deleted
参数
- prevKey (可选)
返回在SCM中,给定prevKey(容器ID) 后被标记为已删除状态,且在OM中存在的容器集合, 以便找出映射到这些已删除状态容器的键列表。例如:prevKey=5,跳过直到准确地定位到前一个容器ID。
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回在SCM中已删除但在OM中存在的容器集合,以找出映射到这些已删除状态容器的键列表。
[
{
"containerId": 2,
"numberOfKeys": 2,
"pipelines": []
}
...
]
GET /api/v1/keys/open
参数
-
prevKey (可选)
返回给定 prevKey id 之后仍然处于打开状态且存在的键/文件集合。 例如:prevKey=/vol1/bucket1/key1,这将跳过键,直到成功定位到给定的 prevKey。
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回处于打开状态的键/文件集合。
{
"lastKey": "/vol1/fso-bucket/dir1/dir2/file2",
"replicatedTotal": 13824,
"unreplicatedTotal": 4608,
"entities": [
{
"path": "/vol1/bucket1/key1",
"keyState": "Open",
"inStateSince": 1667564193026,
"size": 1024,
"replicatedSize": 3072,
"unreplicatedSize": 1024,
"replicationType": "RATIS",
"replicationFactor": "THREE"
},
{
"path": "/vol1/bucket1/key2",
"keyState": "Open",
"inStateSince": 1667564193026,
"size": 512,
"replicatedSize": 1536,
"unreplicatedSize": 512,
"replicationType": "RATIS",
"replicationFactor": "THREE"
},
{
"path": "/vol1/fso-bucket/dir1/file1",
"keyState": "Open",
"inStateSince": 1667564193026,
"size": 1024,
"replicatedSize": 3072,
"unreplicatedSize": 1024,
"replicationType": "RATIS",
"replicationFactor": "THREE"
},
{
"path": "/vol1/fso-bucket/dir1/dir2/file2",
"keyState": "Open",
"inStateSince": 1667564193026,
"size": 2048,
"replicatedSize": 6144,
"unreplicatedSize": 2048,
"replicationType": "RATIS",
"replicationFactor": "THREE"
}
]
}
GET /api/v1/keys/deletePending
参数
-
prevKey (可选)
返回给定 prevKey id 之后处于待删除状态的键/文件集合。 例如:prevKey=/vol1/bucket1/key1,这将跳过键,直到成功定位到给定的 prevKey。
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回处于待删除状态的键/文件集合。
{
"lastKey": "sampleVol/bucketOne/key_one",
"replicatedTotal": -1530804718628866300,
"unreplicatedTotal": -1530804718628866300,
"deletedkeyinfo": [
{
"omKeyInfoList": [
{
"metadata": {},
"objectID": 0,
"updateID": 0,
"parentObjectID": 0,
"volumeName": "sampleVol",
"bucketName": "bucketOne",
"keyName": "key_one",
"dataSize": -1530804718628866300,
"keyLocationVersions": [],
"creationTime": 0,
"modificationTime": 0,
"replicationConfig": {
"replicationFactor": "ONE",
"requiredNodes": 1,
"replicationType": "STANDALONE"
},
"fileChecksum": null,
"fileName": "key_one",
"acls": [],
"path": "0/key_one",
"file": false,
"latestVersionLocations": null,
"replicatedSize": -1530804718628866300,
"fileEncryptionInfo": null,
"objectInfo": "OMKeyInfo{volume='sampleVol', bucket='bucketOne', key='key_one', dataSize='-1530804718628866186', creationTime='0', objectID='0', parentID='0', replication='STANDALONE/ONE', fileChecksum='null}",
"updateIDset": false
}
]
}
],
"status": "OK"
}
GET /api/v1/keys/deletePending/dirs
参数
-
prevKey (可选)
返回给定 prevKey id 之后处于待删除状态的目录集合。 例如:prevKey=/vol1/bucket1/bucket1/dir1,这将跳过目录,直到成功定位到给定的 prevKey。
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回处于待删除状态的目录集合。
{
"lastKey": "vol1/bucket1/bucket1/dir1",
"replicatedTotal": -1530804718628866300,
"unreplicatedTotal": -1530804718628866300,
"deletedkeyinfo": [
{
"omKeyInfoList": [
{
"metadata": {},
"objectID": 0,
"updateID": 0,
"parentObjectID": 0,
"volumeName": "sampleVol",
"bucketName": "bucketOne",
"keyName": "key_one",
"dataSize": -1530804718628866300,
"keyLocationVersions": [],
"creationTime": 0,
"modificationTime": 0,
"replicationConfig": {
"replicationFactor": "ONE",
"requiredNodes": 1,
"replicationType": "STANDALONE"
},
"fileChecksum": null,
"fileName": "key_one",
"acls": [],
"path": "0/key_one",
"file": false,
"latestVersionLocations": null,
"replicatedSize": -1530804718628866300,
"fileEncryptionInfo": null,
"objectInfo": "OMKeyInfo{volume='sampleVol', bucket='bucketOne', key='key_one', dataSize='-1530804718628866186', creationTime='0', objectID='0', parentID='0', replication='STANDALONE/ONE', fileChecksum='null}",
"updateIDset": false
}
]
}
],
"status": "OK"
}
Blocks Metadata (admin only)
GET /api/v1/blocks/deletePending
参数
-
prevKey (可选)
仅返回给定块ID(prevKey)之后处于待删除状态的块列表。 例如:prevKey=4,这将跳过 deletedBlocks 表中的键以跳过 prevKey 之前的记录。
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回待删除的块列表。
{
"OPEN": [
{
"containerId": 100,
"localIDList": [
1,
2,
3,
4
],
"localIDCount": 4,
"txID": 1
}
]
}
Namespace Metadata (仅 admin)
GET /api/v1/namespace/summary
参数
-
path
字符串形式的路径请求,不包含任何协议前缀。
回传
返回路径的基本信息汇总,包括实体类型和路径下对象的聚合计数。
如果路径存在,则 status
为 OK
,否则为 PATH_NOT_FOUND
。
示例: /api/v1/namespace/summary?path=/
{
"status": OK,
"type": ROOT,
"numVolume": 10,
"numBucket": 100,
"numDir": 1000,
"numKey": 10000
}
示例: /api/v1/namespace/summary?path=/volume1
{
"status": OK,
"type": VOLUME,
"numVolume": -1,
"numBucket": 10,
"numDir": 100,
"numKey": 1000
}
示例: /api/v1/namespace/summary?path=/volume1/bucket1
{
"status": OK,
"type": BUCKET,
"numVolume": -1,
"numBucket": -1,
"numDir": 50,
"numKey": 500
}
示例: /api/v1/namespace/summary?path=/volume1/bucket1/dir
{
"status": OK,
"type": DIRECTORY,
"numVolume": -1,
"numBucket": -1,
"numDir": 10,
"numKey": 100
}
示例: /api/v1/namespace/summary?path=/volume1/bucket1/dir/nestedDir
{
"status": OK,
"type": DIRECTORY,
"numVolume": -1,
"numBucket": -1,
"numDir": 5,
"numKey": 50
}
如果任何 num
字段为 -1
,则该路径请求不适用于该实体类型。
GET /api/v1/namespace/du
参数
-
path
字符串形式的路径请求,不包含任何协议前缀。
-
files (可选)
一个布尔值,默认值为
false
。如果设置为true
,则会计算路径下键的磁盘使用情况。 -
replica (可选)
一个布尔值,默认为
false
。如果设置为true
,则会计算键的副本大小的磁盘使用情况。
回传
返回路径下所有子路径的磁盘使用情况。规范化 path
字段,返回路径下直接健的总大小作为
sizeDirectKey
,并以字节为单位返回 size/sizeWithReplica
。
如果路径存在,则 status
为 OK
,否则为 PATH_NOT_FOUND
。
示例: /api/v1/namespace/du?path=/vol1/bucket1&files=true&replica=true
{
"status": OK,
"path": "/vol1/bucket1",
"size": 100000,
"sizeWithReplica": 300000,
"subPathCount": 4,
"subPaths": [
{
"path": "/vol1/bucket1/dir1-1",
"size": 30000,
"sizeWithReplica": 90000,
"isKey": false
},
{
"path": "/vol1/bucket1/dir1-2",
"size": 30000,
"sizeWithReplica": 90000,
"isKey": false
},
{
"path": "/vol1/bucket1/dir1-3",
"size": 30000,
"sizeWithReplica": 90000,
"isKey": false
},
{
"path": "/vol1/bucket1/key1-1",
"size": 10000,
"sizeWithReplica": 30000,
"isKey": true
}
],
"sizeDirectKey": 10000
}
如果 files
设置为 false
,则子路径 /vol1/bucket1/key1-1
将被省略。
如果 replica
设置为 false
,则 sizeWithReplica
返回 -1
。
如果路径的实体类型无法具有直接键(例如根目录、卷),则 sizeDirectKey
返回 -1
。
GET /api/v1/namespace/quota
参数
-
path
路径请求为字符串,不包含任何协议前缀。
回传
返回路径下允许的配额和已使用的配额。 只有卷和存储桶具有配额。其他类型不适用于配额请求
如果请求有效,则 status
为 OK
;如果路径不存在,则为 PATH_NOT_FOUND
;
如果路径存在但路径的实体类型不适用于请求,则为 TYPE_NOT_APPLICABLE
。
示例: /api/v1/namespace/quota?path=/vol
{
"status": OK,
"allowed": 200000,
"used": 160000
}
如果未设置配额,则 allowed
返回 -1
。详情请参阅 [Ozone 中的配额]。
(https://ci-hadoop.apache.org/view/Hadoop%20Ozone/job/ozone-doc-master/lastSuccessfulBuild/artifact/hadoop-hdds/docs/public/feature/quota.html)
GET /api/v1/namespace/dist
参数
-
path
路径请求为字符串,不包含任何协议前缀。
回传
返回路径下所有键的文件大小分布。
如果请求有效,则 status
为 OK
;如果路径不存在,则为 PATH_NOT_FOUND
;
如果路径存在,但该路径是一个键,键不具有文件大小分布,则为 TYPE_NOT_APPLICABLE
。
示例: /api/v1/namespace/dist?path=/
{
"status": OK,
"dist": [
0,
0,
10,
20,
0,
30,
0,
100,
...
]
}
Recon跟踪所有大小从1 KB
到1 PB
的键。对于小于1 KB
的键,映射到第一个箱(索引);
对于大于1 PB
的键,映射到最后一个箱(索引)。
dist
的每个索引都映射到一个文件大小范围(例如 1 MB
到 2 MB
)。
集群状态
GET /api/v1/clusterState
参数
没有参数。
回传
返回 Ozone 集群当前状态的摘要。
{
"pipelines": 5,
"totalDatanodes": 4,
"healthyDatanodes": 4,
"storageReport": {
"capacity": 1081719668736,
"used": 1309212672,
"remaining": 597361258496
},
"containers": 26,
"volumes": 6,
"buckets": 26,
"keys": 25
}
Volumes (仅 admin)
GET /api/v1/volumes
参数
-
prevKey (可选)
仅返回给定 prevKey 之后的卷。 示例: prevKey=vol1
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
返回集群中的所有卷。
{
"totalCount": 4,
"volumes": [{
"volume": "vol1",
"owner": "testuser",
"admin": "ozone",
"creationTime": 1665588176660 ,
"modificationTime": 1665590397315,
"quotaInNamespace": 2048,
"quotaInBytes": 1073741824,
"usedNamespace": 10,
"acls": [
{
"type": "USER",
"name": "testuser",
"scope": "ACCESS",
"aclList": [
"WRITE",
"READ",
"DELETE"
]
}
]
},
...
]
}
Buckets (仅 admin)
GET /api/v1/buckets
参数
-
volume (可选)
卷以字符串形式表示,不包含任何协议前缀。
-
prevKey (可选)
返回给定 prevKey 之后的存储桶。 如果未指定卷,则忽略 prevKey。 示例: prevKey=bucket1
-
limit (可选)
仅返回有限数量的结果。默认限制为1000。
回传
如果未指定卷或指定的卷是一个空字符串,则返回集群中的所有存储桶。
如果指定了 volume
,则仅返回 volume
下的存储桶。
{
"totalCount": 5,
"buckets": [{
"volumeName": "vol1",
"bucketName": "buck1",
"versioning": false,
"storageType": "DISK",
"creationTime": 1665588176616,
"modificationTime": 1665590392293,
"usedBytes": 943718400,
"usedNamespace": 40000,
"quotaInBytes": 1073741824,
"quotaInNamespace": 50000,
"owner": "testuser",
"bucketLayout": "OBJECT_STORE",
"acls": [
{
"type": "USER",
"name": "testuser",
"scope": "ACCESS",
"aclList": [
"WRITE",
"READ",
"DELETE"
]
}
]
},
...
]
}
数据节点
GET /api/v1/datanodes
参数
没有参数。
回传
回传集群中的所有数据节点。
{
"totalCount": 4,
"datanodes": [{
"uuid": "f8f8cb45-3ab2-4123",
"hostname": "localhost-1",
"state": "HEALTHY",
"lastHeartbeat": 1605738400544,
"storageReport": {
"capacity": 270429917184,
"used": 358805504,
"remaining": 119648149504
},
"pipelines": [{
"pipelineID": "b9415b20-b9bd-4225",
"replicationType": "RATIS",
"replicationFactor": 3,
"leaderNode": "localhost-2"
}, {
"pipelineID": "3bf4a9e9-69cc-4d20",
"replicationType": "RATIS",
"replicationFactor": 1,
"leaderNode": "localhost-1"
}],
"containers": 17,
"leaderCount": 1
},
...
]
}
管道
GET /api/v1/pipelines
参数
没有参数
回传
回传在集群中的所有管道。
{
"totalCount": 5,
"pipelines": [{
"pipelineId": "b9415b20-b9bd-4225",
"status": "OPEN",
"leaderNode": "localhost-1",
"datanodes": ["localhost-1", "localhost-2", "localhost-3"],
"lastLeaderElection": 0,
"duration": 23166128,
"leaderElections": 0,
"replicationType": "RATIS",
"replicationFactor": 3,
"containers": 0
},
...
]
}
任务
GET /api/v1/task/status
参数
没有参数
回传
回传所有 Recon 任务的状态。
[
{
"taskName": "OmDeltaRequest",
"lastUpdatedTimestamp": 1605724099147,
"lastUpdatedSeqNumber": 186
},
...
]
使用率
GET /api/v1/utilization/fileCount
参数
-
volume (可选)
根据给定的卷名过滤结果。
-
bucket (可选)
根据给定的桶名过滤结果。
-
fileSize (可选) 根据给定的文件大小筛选结果。
回传
回传不同文件范围内的文件计数,其中响应对象中的fileSize
是文件大小范围的上限。
[{
"volume": "vol-2-04168",
"bucket": "bucket-0-11685",
"fileSize": 1024,
"count": 1
}, {
"volume": "vol-2-04168",
"bucket": "bucket-1-41795",
"fileSize": 1024,
"count": 1
}, {
"volume": "vol-2-04168",
"bucket": "bucket-2-93377",
"fileSize": 1024,
"count": 1
}, {
"volume": "vol-2-04168",
"bucket": "bucket-3-50336",
"fileSize": 1024,
"count": 2
}]
指标
GET /api/v1/metrics/:api
参数
请参阅 Prometheus HTTP API 参考 以获取完整的查询文档。
回传
这是 Prometheus 的代理端点,并回传与 Prometheus 端点相同的响应。 示例:/api/v1/metrics/query?query=ratis_leader_election_electionCount
{
"status": "success",
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"__name__": "ratis_leader_election_electionCount",
"exported_instance": "33a5ac1d-8c65-4c74-a0b8-9314dfcccb42",
"group": "group-03CA9397D54B",
"instance": "ozone_datanode_1:9882",
"job": "ozone"
},
"value": [
1599159384.455,
"5"
]
}
]
}
}