- 数据格式
- 使用 UI REST API
- REST API Base URL
- 在安全的环境中模仿用户
- GET Operations
- /api/v1/cluster/configuration (GET)
- /api/v1/cluster/summary (GET)
- /api/v1/supervisor/summary (GET)
- /api/v1/nimbus/summary (GET)
- /api/v1/history/summary (GET)
- /api/v1/supervisor (GET)
- /api/v1/topology/summary (GET)
- /api/v1/topology-workers/:id (GET)
- /api/v1/topology/:id (GET)
- /api/v1/topology/:id/metrics
- /api/v1/topology/:id/component/:component (GET)
- Profiling and Debugging GET Operations
- /api/v1/topology/:id/profiling/start/:host-port/:timeout (GET)
- /api/v1/topology/:id/profiling/dumpprofile/:host-port (GET)
- /api/v1/topology/:id/profiling/stop/:host-port (GET)
- /api/v1/topology/:id/profiling/dumpjstack/:host-port (GET)
- /api/v1/topology/:id/profiling/dumpheap/:host-port (GET)
- /api/v1/topology/:id/profiling/restartworker/:host-port (GET)
- POST Operations
- API errors
Storm UI 守护程序提供了一个 REST API, 允许您与 Storm 集群进行交互, 其中包括检索 metrics(度量)数据和配置信息, 启动或停止 topologies(拓扑)的管理操作。
数据格式
该 REST API 返回 JSON 响应并支持 JSONP. 客户端可以传回一个回调查询参数, 以在回调函数中包装 JSON。 REST API allows CORS by default.
使用 UI REST API
Note(注意): 建议忽略 JSON 响应中的 undocumented elements(未记录元素),因为未来版本的 Storm 可能不再 支持这些元素.
REST API Base URL
REST API 是 Storm 的 UI 守护进程(由 “storm ui” 启动)的一部分,因此与 Storm UI 在同一主机和端口上运行(UI 守护程序通常与 Nimbus 守护程序在同一主机上运行). 通过 ui.port
来配置 port(端口), 它默认设置为 8080(请参阅 defaults.yaml).
该 API 的 base URL 将是:
http://<ui-host>:<ui-port>/api/v1/...
您可以使用 curl
这样的工具来操作 REST API:
# 请求集群配置
# Note(注意): 我们假设 ui.port 配置的默认值是 8080.
$ curl http://<ui-host>:8080/api/v1/cluster/configuration
在安全的环境中模仿用户
在安全环境中, 经过身份验证的用户可以模拟另一个用户. 为了模拟用户, 调用者必须通过 doAsUser
参数或 header, 其值设置为用户需要执行该 request 请求. 请看 SECURITY.MD 以了解有关如何设置模拟 ACL 和授权的更多信息. 其余的 API 使用与 nimbus 使用的相同的配置和 acls.
示例:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1425844354\?doAsUser=testUSer1
2\. curl 'http://localhost:8080/api/v1/topology/wordcount-1-1425844354/activate' -X POST -H 'doAsUser:testUSer1'
GET Operations
/api/v1/cluster/configuration (GET)
Returns the cluster configuration.
Sample response (does not include all the data fields):
{ "dev.zookeeper.path": "/tmp/dev-storm-zookeeper", "topology.tick.tuple.freq.secs": null, "topology.builtin.metrics.bucket.size.secs": 60, "topology.fall.back.on.java.serialization": true, "topology.max.error.report.per.interval": 5, "zmq.linger.millis": 5000, "topology.skip.missing.kryo.registrations": false, "storm.messaging.netty.client_worker_threads": 1, "ui.childopts": "-Xmx768m", "storm.zookeeper.session.timeout": 20000, "nimbus.reassign": true, "topology.trident.batch.emit.interval.millis": 500, "storm.messaging.netty.flush.check.interval.ms": 10, "nimbus.monitor.freq.secs": 10, "logviewer.childopts": "-Xmx128m", "java.library.path": "/usr/local/lib:/opt/local/lib:/usr/lib", "topology.executor.send.buffer.size": 1024, }
/api/v1/cluster/summary (GET)
Returns cluster summary information such as nimbus uptime or number of supervisors.
Response fields:
Field | Value | Description |
---|---|---|
stormVersion | String | Storm version |
supervisors | Integer | Number of supervisors running |
topologies | Integer | Number of topologies running |
slotsTotal | Integer | Total number of available worker slots |
slotsUsed | Integer | Number of worker slots used |
slotsFree | Integer | Number of worker slots available |
executorsTotal | Integer | Total number of executors |
tasksTotal | Integer | Total tasks |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
totalMem | Double | The total amount of memory in the cluster in MB |
totalCpu | Double | The total amount of CPU in the cluster |
availMem | Double | The amount of available memory in the cluster in MB |
availCpu | Double | The amount of available cpu in the cluster |
memAssignedPercentUtil | Double | The percent utilization of assigned memory resources in cluster |
cpuAssignedPercentUtil | Double | The percent utilization of assigned CPU resources in cluster |
Sample response:
{ "stormVersion": "0.9.2-incubating-SNAPSHOT", "supervisors": 1, "slotsTotal": 4, "slotsUsed": 3, "slotsFree": 1, "executorsTotal": 28, "tasksTotal": 28, "schedulerDisplayResource": true, "totalMem": 4096.0, "totalCpu": 400.0, "availMem": 1024.0, "availCPU": 250.0, "memAssignedPercentUtil": 75.0, "cpuAssignedPercentUtil": 37.5 }
/api/v1/supervisor/summary (GET)
Returns summary information for all supervisors.
Response fields:
Field | Value | Description |
---|---|---|
id | String | Supervisor’s id |
host | String | Supervisor’s host name |
uptime | String | Shows how long the supervisor is running |
uptimeSeconds | Integer | Shows how long the supervisor is running in seconds |
slotsTotal | Integer | Total number of available worker slots for this supervisor |
slotsUsed | Integer | Number of worker slots used on this supervisor |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
totalMem | Double | Total memory capacity on this supervisor |
totalCpu | Double | Total CPU capacity on this supervisor |
usedMem | Double | Used memory capacity on this supervisor |
usedCpu | Double | Used CPU capacity on this supervisor |
Sample response:
{ "supervisors": [ { "id": "0b879808-2a26-442b-8f7d-23101e0c3696", "host": "10.11.1.7", "uptime": "5m 58s", "uptimeSeconds": 358, "slotsTotal": 4, "slotsUsed": 3, "totalMem": 3000, "totalCpu": 400, "usedMem": 1280, "usedCPU": 160 } ], "schedulerDisplayResource": true }
/api/v1/nimbus/summary (GET)
Returns summary information for all nimbus hosts.
Response fields:
Field | Value | Description |
---|---|---|
host | String | Nimbus’ host name |
port | int | Nimbus’ port number |
status | String | Possible values are Leader, Not a Leader, Dead |
nimbusUpTime | String | Shows since how long the nimbus has been running |
nimbusUpTimeSeconds | String | Shows since how long the nimbus has been running in seconds |
nimbusLogLink | String | Logviewer url to view the nimbus.log |
version | String | Version of storm this nimbus host is running |
Sample response:
{ "nimbuses":[ { "host":"192.168.202.1", "port":6627, "nimbusLogLink":"http:\/\/192.168.202.1:8000\/log?file=nimbus.log", "status":Leader, "version":"0.10.0-SNAPSHOT", "nimbusUpTime":"3m 33s", "nimbusUpTimeSeconds":"213" } ] }
/api/v1/history/summary (GET)
Returns a list of all running topologies’ IDs submitted by the current user.
Response fields:
Field | Value | Description |
---|---|---|
topo-history | List | List of Topologies’ IDs |
Sample response:
{ "topo-history":[ "wc6-1-1446571009", "wc8-2-1446587178" ] }
/api/v1/supervisor (GET)
Returns summary for a supervisor by id, or all supervisors running on a host.
Examples:
1\. By host: http://ui-daemon-host-name:8080/api/v1/supervisor?host=supervisor-daemon-host-name
2\. By id: http://ui-daemon-host-name:8080/api/v1/supervisor?id=f5449110-1daa-43e2-89e3-69917b16dec9-192.168.1.1
Request parameters:
Parameter | Value | Description |
---|---|---|
id | String. Supervisor id | If specified, respond with the supervisor and worker stats with id. Note that when id is specified, the host argument is ignored. |
host | String. Host name | If specified, respond with all supervisors and worker stats in the host (normally just one) |
sys | String. Values 1 or 0. Default value 0 | Controls including sys stats part of the response |
Response fields:
Field | Value | Description |
---|---|---|
supervisors | Array | Array of supervisor summaries |
workers | Array | Array of worker summaries |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
Each supervisor is defined by:
Field | Value | Description |
---|---|---|
id | String | Supervisor’s id |
host | String | Supervisor’s host name |
uptime | String | Shows how long the supervisor is running |
uptimeSeconds | Integer | Shows how long the supervisor is running in seconds |
slotsTotal | Integer | Total number of worker slots for this supervisor |
slotsUsed | Integer | Number of worker slots used on this supervisor |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
totalMem | Double | Total memory capacity on this supervisor |
totalCpu | Double | Total CPU capacity on this supervisor |
usedMem | Double | Used memory capacity on this supervisor |
usedCpu | Double | Used CPU capacity on this supervisor |
Each worker is defined by:
Field | Value | Description |
---|---|---|
supervisorId | String | Supervisor’s id |
host | String | Worker’s host name |
port | Integer | Worker’s port |
topologyId | String | Topology Id |
topologyName | String | Topology Name |
executorsTotal | Integer | Number of executors used by the topology in this worker |
assignedMemOnHeap | Double | Assigned On-Heap Memory by Scheduler (MB) |
assignedMemOffHeap | Double | Assigned Off-Heap Memory by Scheduler (MB) |
assignedCpu | Number | Assigned CPU by Scheduler (%) |
componentNumTasks | Dictionary | Components -> # of executing tasks |
uptime | String | Shows how long the worker is running |
uptimeSeconds | Integer | Shows how long the worker is running in seconds |
workerLogLink | String | Link to worker log viewer page |
Sample response:
{ "supervisors": [{ "totalMem": 4096.0, "host":"192.168.10.237", "id":"bdfe8eff-f1d8-4bce-81f5-9d3ae1bf432e-169.254.129.212", "uptime":"7m 8s", "totalCpu":400.0, "usedCpu":495.0, "usedMem":3432.0, "slotsUsed":2, "version":"0.10.1", "slotsTotal":4, "uptimeSeconds":428 }], "schedulerDisplayResource":true, "workers":[{ "topologyName":"ras", "topologyId":"ras-4-1460229987", "host":"192.168.10.237", "supervisorId":"bdfe8eff-f1d8-4bce-81f5-9d3ae1bf432e-169.254.129.212", "assignedMemOnHeap":704.0, "uptime":"2m 47s", "uptimeSeconds":167, "port":6707, "workerLogLink":"http:\/\/192.168.10.237:8000\/log?file=ras-4-1460229987%2F6707%2Fworker.log", "componentNumTasks": { "word":5 }, "executorsTotal":8, "assignedCpu":130.0, "assignedMemOffHeap":80.0 }, { "topologyName":"ras", "topologyId":"ras-4-1460229987", "host":"192.168.10.237", "supervisorId":"bdfe8eff-f1d8-4bce-81f5-9d3ae1bf432e-169.254.129.212", "assignedMemOnHeap":904.0, "uptime":"2m 53s", "port":6706, "workerLogLink":"http:\/\/192.168.10.237:8000\/log?file=ras-4-1460229987%2F6706%2Fworker.log", "componentNumTasks":{ "exclaim2":2, "exclaim1":3, "word":5 }, "executorsTotal":10, "uptimeSeconds":173, "assignedCpu":165.0, "assignedMemOffHeap":80.0 }] }
/api/v1/topology/summary (GET)
Returns summary information for all topologies.
Response fields:
Field | Value | Description |
---|---|---|
id | String | Topology Id |
name | String | Topology Name |
status | String | Topology Status |
uptime | String | Shows how long the topology is running |
uptimeSeconds | Integer | Shows how long the topology is running in seconds |
tasksTotal | Integer | Total number of tasks for this topology |
workersTotal | Integer | Number of workers used for this topology |
executorsTotal | Integer | Number of executors used for this topology |
replicationCount | Integer | Number of nimbus hosts on which this topology code is replicated |
requestedMemOnHeap | Double | Requested On-Heap Memory by User (MB) |
requestedMemOffHeap | Double | Requested Off-Heap Memory by User (MB) |
requestedTotalMem | Double | Requested Total Memory by User (MB) |
requestedCpu | Double | Requested CPU by User (%) |
assignedMemOnHeap | Double | Assigned On-Heap Memory by Scheduler (MB) |
assignedMemOffHeap | Double | Assigned Off-Heap Memory by Scheduler (MB) |
assignedTotalMem | Double | Assigned Total Memory by Scheduler (MB) |
assignedCpu | Double | Assigned CPU by Scheduler (%) |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
Sample response:
{ "topologies": [ { "id": "WordCount3-1-1402960825", "name": "WordCount3", "status": "ACTIVE", "uptime": "6m 5s", "uptimeSeconds": 365, "tasksTotal": 28, "workersTotal": 3, "executorsTotal": 28, "replicationCount": 1, "requestedMemOnHeap": 640, "requestedMemOffHeap": 128, "requestedTotalMem": 768, "requestedCpu": 80, "assignedMemOnHeap": 640, "assignedMemOffHeap": 128, "assignedTotalMem": 768, "assignedCpu": 80 } ], "schedulerDisplayResource": true }
/api/v1/topology-workers/:id (GET)
Returns the worker’ information (host and port) for a topology.
Response fields:
Field | Value | Description |
---|---|---|
hostPortList | List | Workers’ information for a topology |
name | Integer | Logviewer Port |
Sample response:
{ "hostPortList":[ { "host":"192.168.202.2", "port":6701 }, { "host":"192.168.202.2", "port":6702 }, { "host":"192.168.202.3", "port":6700 } ], "logviewerPort":8000 }
/api/v1/topology/:id (GET)
Returns topology information and statistics. Substitute id with topology id.
Request parameters:
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
window | String. Default value :all-time | Window duration for metrics in seconds |
sys | String. Values 1 or 0. Default value 0 | Controls including sys stats part of the response |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Topology Id |
name | String | Topology Name |
uptime | String | How long the topology has been running |
uptimeSeconds | Integer | How long the topology has been running in seconds |
status | String | Current status of the topology, e.g. “ACTIVE” |
tasksTotal | Integer | Total number of tasks for this topology |
workersTotal | Integer | Number of workers used for this topology |
executorsTotal | Integer | Number of executors used for this topology |
msgTimeout | Integer | Number of seconds a tuple has before the spout considers it failed |
windowHint | String | window param value in “hh mm ss” format. Default value is “All Time” |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
replicationCount | Integer | Number of nimbus hosts on which this topology code is replicated |
debug | Boolean | If debug is enabled for the topology |
samplingPct | Double | Controls downsampling of events before they are sent to event log (percentage) |
assignedMemOnHeap | Double | Assigned On-Heap Memory by Scheduler (MB) |
assignedMemOffHeap | Double | Assigned Off-Heap Memory by Scheduler (MB) |
assignedTotalMem | Double | Assigned Off-Heap + On-Heap Memory by Scheduler(MB) |
assignedCpu | Double | Assigned CPU by Scheduler(%) |
requestedMemOnHeap | Double | Requested On-Heap Memory by User (MB) |
requestedMemOffHeap | Double | Requested Off-Heap Memory by User (MB) |
requestedCpu | Double | Requested CPU by User (%) |
topologyStats | Array | Array of all the topology related stats per time window |
topologyStats.windowPretty | String | Duration passed in HH:MM:SS format |
topologyStats.window | String | User requested time window for metrics |
topologyStats.emitted | Long | Number of messages emitted in given window |
topologyStats.trasferred | Long | Number messages transferred in given window |
topologyStats.completeLatency | String (double value returned in String format) | Total latency for processing the message |
topologyStats.acked | Long | Number of messages acked in given window |
topologyStats.failed | Long | Number of messages failed in given window |
workers | Array | Array of workers in topology |
workers.supervisorId | String | Supervisor’s id |
workers.host | String | Worker’s host name |
workers.port | Integer | Worker’s port |
workers.topologyId | String | Topology Id |
workers.topologyName | String | Topology Name |
workers.executorsTotal | Integer | Number of executors used by the topology in this worker |
workers.assignedMemOnHeap | Double | Assigned On-Heap Memory by Scheduler (MB) |
workers.assignedMemOffHeap | Double | Assigned Off-Heap Memory by Scheduler (MB) |
workers.assignedCpu | Number | Assigned CPU by Scheduler (%) |
workers.componentNumTasks | Dictionary | Components -> # of executing tasks |
workers.uptime | String | Shows how long the worker is running |
workers.uptimeSeconds | Integer | Shows how long the worker is running in seconds |
workers.workerLogLink | String | Link to worker log viewer page |
spouts | Array | Array of all the spout components in the topology |
spouts.spoutId | String | Spout id |
spouts.executors | Integer | Number of executors for the spout |
spouts.emitted | Long | Number of messages emitted in given window |
spouts.completeLatency | String (double value returned in String format) | Total latency for processing the message |
spouts.transferred | Long | Total number of messages transferred in given window |
spouts.tasks | Integer | Total number of tasks for the spout |
spouts.lastError | String | Shows the last error happened in a spout |
spouts.errorLapsedSecs | Integer | Number of seconds elapsed since that last error happened in a spout |
spouts.errorWorkerLogLink | String | Link to the worker log that reported the exception |
spouts.acked | Long | Number of messages acked |
spouts.failed | Long | Number of messages failed |
spouts.requestedMemOnHeap | Double | Requested On-Heap Memory by User (MB) |
spouts.requestedMemOffHeap | Double | Requested Off-Heap Memory by User (MB) |
spouts.requestedCpu | Double | Requested CPU by User (%) |
bolts | Array | Array of bolt components in the topology |
bolts.boltId | String | Bolt id |
bolts.capacity | String (double value returned in String format) | This value indicates number of messages executed * average execute latency / time window |
bolts.processLatency | String (double value returned in String format) | Average time of the bolt to ack a message after it was received |
bolts.executeLatency | String (double value returned in String format) | Average time to run the execute method of the bolt |
bolts.executors | Integer | Number of executor tasks in the bolt component |
bolts.tasks | Integer | Number of instances of bolt |
bolts.acked | Long | Number of tuples acked by the bolt |
bolts.failed | Long | Number of tuples failed by the bolt |
bolts.lastError | String | Shows the last error occurred in the bolt |
bolts.errorLapsedSecs | Integer | Number of seconds elapsed since that last error happened in a bolt |
bolts.errorWorkerLogLink | String | Link to the worker log that reported the exception |
bolts.emitted | Long | Number of tuples emitted |
bolts.requestedMemOnHeap | Double | Requested On-Heap Memory by User (MB) |
bolts.requestedMemOffHeap | Double | Requested Off-Heap Memory by User (MB) |
bolts.requestedCpu | Double | Requested CPU by User (%) |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825
2\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825?sys=1
3\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825?window=600
Sample response:
{ "name": "WordCount3", "id": "WordCount3-1-1402960825", "workersTotal": 3, "window": "600", "status": "ACTIVE", "tasksTotal": 28, "executorsTotal": 28, "uptime": "29m 19s", "uptimeSeconds": 1759, "msgTimeout": 30, "windowHint": "10m 0s", "schedulerDisplayResource": true, "topologyStats": [ { "windowPretty": "10m 0s", "window": "600", "emitted": 397960, "transferred": 213380, "completeLatency": "0.000", "acked": 213460, "failed": 0 }, { "windowPretty": "3h 0m 0s", "window": "10800", "emitted": 1190260, "transferred": 638260, "completeLatency": "0.000", "acked": 638280, "failed": 0 }, { "windowPretty": "1d 0h 0m 0s", "window": "86400", "emitted": 1190260, "transferred": 638260, "completeLatency": "0.000", "acked": 638280, "failed": 0 }, { "windowPretty": "All time", "window": ":all-time", "emitted": 1190260, "transferred": 638260, "completeLatency": "0.000", "acked": 638280, "failed": 0 } ], "workers":[{ "topologyName":"WordCount3", "topologyId":"WordCount3-1-1402960825", "host":"192.168.10.237", "supervisorId":"bdfe8eff-f1d8-4bce-81f5-9d3ae1bf432e-169.254.129.212", "uptime":"2m 47s", "uptimeSeconds":167, "port":6707, "workerLogLink":"http:\/\/192.168.10.237:8000\/log?file=WordCount3-1-1402960825%2F6707%2Fworker.log", "componentNumTasks": { "spout":5 }, "executorsTotal":8, "assignedMemOnHeap":704.0, "assignedCpu":130.0, "assignedMemOffHeap":80.0 }], "spouts": [ { "executors": 5, "emitted": 28880, "completeLatency": "0.000", "transferred": 28880, "acked": 0, "spoutId": "spout", "tasks": 5, "lastError": "", "errorLapsedSecs": null, "failed": 0 } ], "bolts": [ { "executors": 12, "emitted": 184580, "transferred": 0, "acked": 184640, "executeLatency": "0.048", "tasks": 12, "executed": 184620, "processLatency": "0.043", "boltId": "count", "lastError": "", "errorLapsedSecs": null, "capacity": "0.003", "failed": 0 }, { "executors": 8, "emitted": 184500, "transferred": 184500, "acked": 28820, "executeLatency": "0.024", "tasks": 8, "executed": 28780, "processLatency": "2.112", "boltId": "split", "lastError": "", "errorLapsedSecs": null, "capacity": "0.000", "failed": 0 } ], "configuration": { "storm.id": "WordCount3-1-1402960825", "dev.zookeeper.path": "/tmp/dev-storm-zookeeper", "topology.tick.tuple.freq.secs": null, "topology.builtin.metrics.bucket.size.secs": 60, "topology.fall.back.on.java.serialization": true, "topology.max.error.report.per.interval": 5, "zmq.linger.millis": 5000, "topology.skip.missing.kryo.registrations": false, "storm.messaging.netty.client_worker_threads": 1, "ui.childopts": "-Xmx768m", "storm.zookeeper.session.timeout": 20000, "nimbus.reassign": true, "topology.trident.batch.emit.interval.millis": 500, "storm.messaging.netty.flush.check.interval.ms": 10, "nimbus.monitor.freq.secs": 10, "logviewer.childopts": "-Xmx128m", "java.library.path": "/usr/local/lib:/opt/local/lib:/usr/lib", "topology.executor.send.buffer.size": 1024, "storm.local.dir": "storm-local", "storm.messaging.netty.buffer_size": 5242880, "supervisor.worker.start.timeout.secs": 120, "topology.enable.message.timeouts": true, "nimbus.cleanup.inbox.freq.secs": 600, "nimbus.inbox.jar.expiration.secs": 3600, "drpc.worker.threads": 64, "topology.worker.shared.thread.pool.size": 4, "nimbus.seeds": [ "hw10843.local" ], "storm.messaging.netty.min_wait_ms": 100, "storm.zookeeper.port": 2181, "transactional.zookeeper.port": null, "topology.executor.receive.buffer.size": 1024, "transactional.zookeeper.servers": null, "storm.zookeeper.root": "/storm", "storm.zookeeper.retry.intervalceiling.millis": 30000, "supervisor.enable": true, "storm.messaging.netty.server_worker_threads": 1 }, "replicationCount": 1 }
/api/v1/topology/:id/metrics
Returns detailed metrics for topology. It shows metrics per component, which are aggregated by stream.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
window | String. Default value :all-time | window duration for metrics in seconds |
sys | String. Values 1 or 0. Default value 0 | Controls including sys stats part of the response |
Response fields:
Field | Value | Description |
---|---|---|
window | String. Default value “:all-time” | window duration for metrics in seconds |
windowHint | String | |
spouts | Array | Array of all the spout components in the topology |
spouts.id | String | Spout id |
spouts.emitted | Array | Array of all the output streams this spout emits messages |
spouts.emitted.stream_id | String | Stream id for this stream |
spouts.emitted.value | Long | Number of messages emitted in given window |
spouts.transferred | Array | Array of all the output streams this spout transfers messages |
spouts.transferred.stream_id | String | Stream id for this stream |
spouts.transferred.value | Long | Number messages transferred in given window |
spouts.acked | Array | Array of all the output streams this spout receives ack of messages |
spouts.acked.stream_id | String | Stream id for this stream |
spouts.acked.value | Long | Number of messages acked in given window |
spouts.failed | Array | Array of all the output streams this spout receives fail of messages |
spouts.failed.stream_id | String | Stream id for this stream |
spouts.failed.value | Long | Number of messages failed in given window |
spouts.complete_ms_avg | Array | Array of all the output streams this spout receives ack of messages |
spouts.complete_ms_avg.stream_id | String | Stream id for this stream |
spouts.complete_ms_avg.value | String (double value returned in String format) | Total latency for processing the message |
bolts | Array | Array of all the bolt components in the topology |
bolts.id | String | Bolt id |
bolts.emitted | Array | Array of all the output streams this bolt emits messages |
bolts.emitted.stream_id | String | Stream id for this stream |
bolts.emitted.value | Long | Number of messages emitted in given window |
bolts.transferred | Array | Array of all the output streams this bolt transfers messages |
bolts.transferred.stream_id | String | Stream id for this stream |
bolts.transferred.value | Long | Number messages transferred in given window |
bolts.acked | Array | Array of all the input streams this bolt acknowledges of messages |
bolts.acked.component_id | String | Component id for this stream |
bolts.acked.stream_id | String | Stream id for this stream |
bolts.acked.value | Long | Number of messages acked in given window |
bolts.failed | Array | Array of all the input streams this bolt receives fail of messages |
bolts.failed.component_id | String | Component id for this stream |
bolts.failed.stream_id | String | Stream id for this stream |
bolts.failed.value | Long | Number of messages failed in given window |
bolts.process_ms_avg | Array | Array of all the input streams this spout acks messages |
bolts.process_ms_avg.component_id | String | Component id for this stream |
bolts.process_ms_avg.stream_id | String | Stream id for this stream |
bolts.process_ms_avg.value | String (double value returned in String format) | Average time of the bolt to ack a message after it was received |
bolts.executed | Array | Array of all the input streams this bolt executes messages |
bolts.executed.component_id | String | Component id for this stream |
bolts.executed.stream_id | String | Stream id for this stream |
bolts.executed.value | Long | Number of messages executed in given window |
bolts.executed_ms_avg | Array | Array of all the output streams this spout receives ack of messages |
bolts.executed_ms_avg.component_id | String | Component id for this stream |
bolts.executed_ms_avg.stream_id | String | Stream id for this stream |
bolts.executed_ms_avg.value | String (double value returned in String format) | Average time to run the execute method of the bolt |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/metrics
1\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/metrics?sys=1
2\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/metrics?window=600
Sample response:
{ "window":":all-time", "window-hint":"All time", "spouts":[ { "id":"spout", "emitted":[ { "stream_id":"__metrics", "value":20 }, { "stream_id":"default", "value":17350280 }, { "stream_id":"__ack_init", "value":17328160 }, { "stream_id":"__system", "value":20 } ], "transferred":[ { "stream_id":"__metrics", "value":20 }, { "stream_id":"default", "value":17350280 }, { "stream_id":"__ack_init", "value":17328160 }, { "stream_id":"__system", "value":0 } ], "acked":[ { "stream_id":"default", "value":17339180 } ], "failed":[ ], "complete_ms_avg":[ { "stream_id":"default", "value":"920.497" } ] } ], "bolts":[ { "id":"count", "emitted":[ { "stream_id":"__metrics", "value":120 }, { "stream_id":"default", "value":190748180 }, { "stream_id":"__ack_ack", "value":190718100 }, { "stream_id":"__system", "value":20 } ], "transferred":[ { "stream_id":"__metrics", "value":120 }, { "stream_id":"default", "value":0 }, { "stream_id":"__ack_ack", "value":190718100 }, { "stream_id":"__system", "value":0 } ], "acked":[ { "component_id":"split", "stream_id":"default", "value":190733160 } ], "failed":[ ], "process_ms_avg":[ { "component_id":"split", "stream_id":"default", "value":"0.004" } ], "executed":[ { "component_id":"split", "stream_id":"default", "value":190733140 } ], "executed_ms_avg":[ { "component_id":"split", "stream_id":"default", "value":"0.005" } ] }, { "id":"split", "emitted":[ { "stream_id":"__metrics", "value":60 }, { "stream_id":"default", "value":190754740 }, { "stream_id":"__ack_ack", "value":17317580 }, { "stream_id":"__system", "value":20 } ], "transferred":[ { "stream_id":"__metrics", "value":60 }, { "stream_id":"default", "value":190754740 }, { "stream_id":"__ack_ack", "value":17317580 }, { "stream_id":"__system", "value":0 } ], "acked":[ { "component_id":"spout", "stream_id":"default", "value":17339180 } ], "failed":[ ], "process_ms_avg":[ { "component_id":"spout", "stream_id":"default", "value":"0.051" } ], "executed":[ { "component_id":"spout", "stream_id":"default", "value":17339240 } ], "executed_ms_avg":[ { "component_id":"spout", "stream_id":"default", "value":"0.052" } ] } ] }
/api/v1/topology/:id/component/:component (GET)
Returns detailed metrics and executor information
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
component | String (required) | Component Id |
window | String. Default value :all-time | window duration for metrics in seconds |
sys | String. Values 1 or 0. Default value 0 | controls including sys stats part of the response |
Response fields:
Field | Value | Description |
---|---|---|
user | String | Topology owner |
id | String | Component id |
encodedId | String | URL encoded component id |
name | String | Topology name |
executors | Integer | Number of executor tasks in the component |
tasks | Integer | Number of instances of component |
requestedMemOnHeap | Double | Requested On-Heap Memory by User (MB) |
requestedMemOffHeap | Double | Requested Off-Heap Memory by User (MB) |
requestedCpu | Double | Requested CPU by User (%) |
schedulerDisplayResource | Boolean | Whether to display scheduler resource information |
topologyId | String | Topology id |
topologyStatus | String | Topology status |
encodedTopologyId | String | URL encoded topology id |
window | String. Default value “All Time” | window duration for metrics in seconds |
componentType | String | component type: SPOUT or BOLT |
windowHint | String | window param value in “hh mm ss” format. Default value is “All Time” |
debug | Boolean | If debug is enabled for the component |
samplingPct | Double | Controls downsampling of events before they are sent to event log (percentage) |
eventLogLink | String | URL viewer link to event log (debug mode) |
profilingAndDebuggingCapable | Boolean | true if there is support for Profiling and Debugging Actions |
profileActionEnabled | Boolean | true if worker profiling (Java Flight Recorder) is enabled |
profilerActive | Array | Array of currently active Profiler Actions |
componentErrors | Array of Errors | List of component errors |
componentErrors.errorTime | Long | Timestamp when the exception occurred (Prior to 0.11.0, this field was named ‘time’.) |
componentErrors.errorHost | String | host name for the error |
componentErrors.errorPort | String | port for the error |
componentErrors.error | String | Shows the error happened in a component |
componentErrors.errorLapsedSecs | Integer | Number of seconds elapsed since the error happened in a component |
componentErrors.errorWorkerLogLink | String | Link to the worker log that reported the exception |
spoutSummary | Array | (only for spouts) Array of component stats, one element per window. |
spoutSummary.windowPretty | String | Duration passed in HH:MM:SS format |
spoutSummary.window | String | window duration for metrics in seconds |
spoutSummary.emitted | Long | Number of messages emitted in given window |
spoutSummary.completeLatency | String (double value returned in String format) | Total latency for processing the message |
spoutSummary.transferred | Long | Total number of messages transferred in given window |
spoutSummary.acked | Long | Number of messages acked |
spoutSummary.failed | Long | Number of messages failed |
boltStats | Array | (only for bolts) Array of component stats, one element per window. |
boltStats.windowPretty | String | Duration passed in HH:MM:SS format |
boltStats.window | String | window duration for metrics in seconds |
boltStats.transferred | Long | Total number of messages transferred in given window |
boltStats.processLatency | String (double value returned in String format) | Average time of the bolt to ack a message after it was received |
boltStats.acked | Long | Number of messages acked |
boltStats.failed | Long | Number of messages failed |
inputStats | Array | (only for bolts) Array of input stats |
inputStats.component | String | Component id |
inputStats.encodedComponentId | String | URL encoded component id |
inputStats.executeLatency | Long | The average time a tuple spends in the execute method |
inputStats.processLatency | Long | The average time it takes to ack a tuple after it is first received |
inputStats.executed | Long | The number of incoming tuples processed |
inputStats.acked | Long | Number of messages acked |
inputStats.failed | Long | Number of messages failed |
inputStats.stream | String | The name of the tuple stream given in the topology, or “default” if none specified |
outputStats | Array | Array of output stats |
outputStats.transferred | Long | Number of tuples emitted that sent to one ore more bolts |
outputStats.emitted | Long | Number of tuples emitted |
outputStats.stream | String | The name of the tuple stream given in the topology, or “default” if none specified |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout
2\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout?sys=1
3\. http://ui-daemon-host-name:8080/api/v1/topology/WordCount3-1-1402960825/component/spout?window=600
Sample response:
{ "name": "WordCount3", "id": "spout", "componentType": "spout", "windowHint": "10m 0s", "executors": 5, "componentErrors":[{"errorTime": 1406006074000, "errorHost": "10.11.1.70", "errorPort": 6701, "errorWorkerLogLink": "http://10.11.1.7:8000/log?file=worker-6701.log", "errorLapsedSecs": 16, "error": "java.lang.RuntimeException: java.lang.StringIndexOutOfBoundsException: Some Error\n\tat org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:128)\n\tat org.apache.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:99)\n\tat org.apache.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:80)\n\tat backtype...more.." }], "topologyId": "WordCount3-1-1402960825", "tasks": 5, "window": "600", "profilerActive": [ { "host": "10.11.1.70", "port": "6701", "dumplink":"http:\/\/10.11.1.70:8000\/dumps\/ex-1-1452718803\/10.11.1.70%3A6701", "timestamp":"576328" } ], "profilingAndDebuggingCapable": true, "profileActionEnabled": true, "spoutSummary": [ { "windowPretty": "10m 0s", "window": "600", "emitted": 28500, "transferred": 28460, "completeLatency": "0.000", "acked": 0, "failed": 0 }, { "windowPretty": "3h 0m 0s", "window": "10800", "emitted": 127640, "transferred": 127440, "completeLatency": "0.000", "acked": 0, "failed": 0 }, { "windowPretty": "1d 0h 0m 0s", "window": "86400", "emitted": 127640, "transferred": 127440, "completeLatency": "0.000", "acked": 0, "failed": 0 }, { "windowPretty": "All time", "window": ":all-time", "emitted": 127640, "transferred": 127440, "completeLatency": "0.000", "acked": 0, "failed": 0 } ], "outputStats": [ { "stream": "__metrics", "emitted": 40, "transferred": 0, "completeLatency": "0", "acked": 0, "failed": 0 }, { "stream": "default", "emitted": 28460, "transferred": 28460, "completeLatency": "0", "acked": 0, "failed": 0 } ], "executorStats": [ { "workerLogLink": "http://10.11.1.7:8000/log?file=worker-6701.log", "emitted": 5720, "port": 6701, "completeLatency": "0.000", "transferred": 5720, "host": "10.11.1.7", "acked": 0, "uptime": "43m 4s", "uptimeSeconds": 2584, "id": "[24-24]", "failed": 0 }, { "workerLogLink": "http://10.11.1.7:8000/log?file=worker-6703.log", "emitted": 5700, "port": 6703, "completeLatency": "0.000", "transferred": 5700, "host": "10.11.1.7", "acked": 0, "uptime": "42m 57s", "uptimeSeconds": 2577, "id": "[25-25]", "failed": 0 }, { "workerLogLink": "http://10.11.1.7:8000/log?file=worker-6702.log", "emitted": 5700, "port": 6702, "completeLatency": "0.000", "transferred": 5680, "host": "10.11.1.7", "acked": 0, "uptime": "42m 57s", "uptimeSeconds": 2577, "id": "[26-26]", "failed": 0 }, { "workerLogLink": "http://10.11.1.7:8000/log?file=worker-6701.log", "emitted": 5700, "port": 6701, "completeLatency": "0.000", "transferred": 5680, "host": "10.11.1.7", "acked": 0, "uptime": "43m 4s", "uptimeSeconds": 2584, "id": "[27-27]", "failed": 0 }, { "workerLogLink": "http://10.11.1.7:8000/log?file=worker-6703.log", "emitted": 5680, "port": 6703, "completeLatency": "0.000", "transferred": 5680, "host": "10.11.1.7", "acked": 0, "uptime": "42m 57s", "uptimeSeconds": 2577, "id": "[28-28]", "failed": 0 } ] }
Profiling and Debugging GET Operations
/api/v1/topology/:id/profiling/start/:host-port/:timeout (GET)
Request to start profiler on worker with timeout. Returns status and link to profiler artifacts for worker.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
timeout | String (required) | Time out for profiler to stop in minutes |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
timeout | String | Requested timeout |
dumplink | String | Link to logviewer URL for worker profiler documents. |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/start/10.11.1.7:6701/10
2\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/start/10.11.1.7:6701/5
3\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/start/10.11.1.7:6701/20
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", "timeout": "10", "dumplink": "http:\/\/10.11.1.7:8000\/dumps\/wordcount-1-1446614150\/10.11.1.7%3A6701" }
/api/v1/topology/:id/profiling/dumpprofile/:host-port (GET)
Request to dump profiler recording on worker. Returns status and worker id for the request.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/dumpprofile/10.11.1.7:6701
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", }
/api/v1/topology/:id/profiling/stop/:host-port (GET)
Request to stop profiler on worker. Returns status and worker id for the request.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/stop/10.11.1.7:6701
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", }
/api/v1/topology/:id/profiling/dumpjstack/:host-port (GET)
Request to dump jstack on worker. Returns status and worker id for the request.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/dumpjstack/10.11.1.7:6701
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", }
/api/v1/topology/:id/profiling/dumpheap/:host-port (GET)
Request to dump heap (jmap) on worker. Returns status and worker id for the request.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/dumpheap/10.11.1.7:6701
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", }
/api/v1/topology/:id/profiling/restartworker/:host-port (GET)
Request to request the worker. Returns status and worker id for the request.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
host-port | String (required) | Worker Id |
Response fields:
Field | Value | Description |
---|---|---|
id | String | Worker id |
status | String | Response Status |
Examples:
1\. http://ui-daemon-host-name:8080/api/v1/topology/wordcount-1-1446614150/profiling/restartworker/10.11.1.7:6701
Sample response:
{ "status": "ok", "id": "10.11.1.7:6701", }
POST Operations
/api/v1/topology/:id/activate (POST)
Activates a topology.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
Sample Response:
{"topologyOperation":"activate","topologyId":"wordcount-1-1420308665","status":"success"}
/api/v1/topology/:id/deactivate (POST)
Deactivates a topology.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
Sample Response:
{"topologyOperation":"deactivate","topologyId":"wordcount-1-1420308665","status":"success"}
/api/v1/topology/:id/rebalance/:wait-time (POST)
Rebalances a topology.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
wait-time | String (required) | Wait time before rebalance happens |
rebalanceOptions | Json (optional) | topology rebalance options |
Sample rebalanceOptions json:
{"rebalanceOptions" : {"numWorkers" : 2, "executors" : {"spout" :4, "count" : 10}}, "callback" : "foo"}
Examples:
curl -i -b ~/cookiejar.txt -c ~/cookiejar.txt -X POST
-H "Content-Type: application/json"
-d '{"rebalanceOptions": {"numWorkers": 2, "executors": { "spout" : "5", "split": 7, "count": 5 }}, "callback":"foo"}'
http://localhost:8080/api/v1/topology/wordcount-1-1420308665/rebalance/0
Sample Response:
{"topologyOperation":"rebalance","topologyId":"wordcount-1-1420308665","status":"success"}
/api/v1/topology/:id/kill/:wait-time (POST)
Kills a topology.
Parameter | Value | Description |
---|---|---|
id | String (required) | Topology Id |
wait-time | String (required) | Wait time before rebalance happens |
Caution: Small wait times (0-5 seconds) may increase the probability of triggering the bug reported in STORM-112, which may result in broker Supervisor daemons.
Sample Response:
{"topologyOperation":"kill","topologyId":"wordcount-1-1420308665","status":"success"}
API errors
The API returns 500 HTTP status codes in case of any errors.
Sample response:
{ "error": "Internal Server Error", "errorMessage": "java.lang.NullPointerException\n\tat clojure.core$name.invoke(core.clj:1505)\n\tat org.apache.storm.ui.core$component_page.invoke(core.clj:752)\n\tat org.apache.storm.ui.core$fn__7766.invoke(core.clj:782)\n\tat compojure.core$make_route$fn__5755.invoke(core.clj:93)\n\tat compojure.core$if_route$fn__5743.invoke(core.clj:39)\n\tat compojure.core$if_method$fn__5736.invoke(core.clj:24)\n\tat compojure.core$routing$fn__5761.invoke(core.clj:106)\n\tat clojure.core$some.invoke(core.clj:2443)\n\tat compojure.core$routing.doInvoke(core.clj:106)\n\tat clojure.lang.RestFn.applyTo(RestFn.java:139)\n\tat clojure.core$apply.invoke(core.clj:619)\n\tat compojure.core$routes$fn__5765.invoke(core.clj:111)\n\tat ring.middleware.reload$wrap_reload$fn__6880.invoke(reload.clj:14)\n\tat org.apache.storm.ui.core$catch_errors$fn__7800.invoke(core.clj:836)\n\tat ring.middleware.keyword_params$wrap_keyword_params$fn__6319.invoke(keyword_params.clj:27)\n\tat ring.middleware.nested_params$wrap_nested_params$fn__6358.invoke(nested_params.clj:65)\n\tat ring.middleware.params$wrap_params$fn__6291.invoke(params.clj:55)\n\tat ring.middleware.multipart_params$wrap_multipart_params$fn__6386.invoke(multipart_params.clj:103)\n\tat ring.middleware.flash$wrap_flash$fn__6675.invoke(flash.clj:14)\n\tat ring.middleware.session$wrap_session$fn__6664.invoke(session.clj:43)\n\tat ring.middleware.cookies$wrap_cookies$fn__6595.invoke(cookies.clj:160)\n\tat ring.adapter.jetty$proxy_handler$fn__6112.invoke(jetty.clj:16)\n\tat ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler$0.handle(Unknown Source)\n\tat org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)\n\tat org.mortbay.jetty.Server.handle(Server.java:326)\n\tat org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)\n\tat org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)\n\tat org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)\n\tat org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)\n\tat org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)\n\tat org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)\n\tat org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)\n" }