Apache HertzBeat RESTful API全攻略:二次开发必备

Apache HertzBeat RESTful API全攻略:二次开发必备

在现代监控系统中,API接口是连接用户与系统核心功能的桥梁。Apache HertzBeat作为一款功能强大的实时监控系统,提供了丰富的RESTful API接口,为二次开发提供了极大的灵活性。本文将详细介绍HertzBeat的RESTful API体系,帮助开发者快速上手并实现自定义功能。

API架构概览

HertzBeat的API系统采用分层架构设计,主要包含控制器层、服务层和数据访问层。控制器层负责处理HTTP请求,服务层实现业务逻辑,数据访问层负责与数据库交互。这种分层设计保证了系统的可扩展性和可维护性。

API架构

核心API模块位于manager/src/main/java/org/apache/hertzbeat/manager/controller目录下,包含多个控制器类,分别处理不同类型的API请求。主要控制器包括:

认证与授权

HertzBeat的API接口需要进行认证授权才能访问。认证通过JWT(JSON Web Token)实现,用户登录成功后获取token,后续请求在HTTP头部携带token即可。

认证相关的代码实现位于AccountController.java,主要提供登录和刷新token的接口:

@PostMapping("/login")
@Operation(summary = "User login", description = "User login to get access token")
public ResponseEntity<Message<LoginResponse>> login(@Valid @RequestBody LoginRequest loginRequest) {
    // 登录逻辑实现
}

@PostMapping("/refresh")
@Operation(summary = "Refresh token", description = "Refresh access token with refresh token")
public ResponseEntity<Message<RefreshTokenResponse>> refreshToken(@RequestBody RefreshTokenRequest request) {
    // 刷新token逻辑实现
}

监控管理API详解

监控管理是HertzBeat的核心功能,提供了丰富的API接口来管理监控任务。主要分为单个监控管理和批量监控管理两类接口。

单个监控管理API

MonitorController.java提供了单个监控任务的完整生命周期管理接口:

添加监控
@PostMapping
@Operation(summary = "Add a monitoring application", description = "Add a monitoring application")
public ResponseEntity<Message<Void>> addNewMonitor(@Valid @RequestBody MonitorDto monitorDto) {
    // 验证请求数据
    monitorService.validate(monitorDto, false);
    monitorService.addMonitor(monitorDto.getMonitor(), monitorDto.getParams(), monitorDto.getCollector());
    return ResponseEntity.ok(Message.success("Add success"));
}

请求示例

{
  "monitor": {
    "name": "Linux Server Monitor",
    "app": "linux",
    "host": "192.168.1.100",
    "interval": 10,
    "timeout": 3000,
    "status": 1
  },
  "params": [
    {"key": "username", "value": "admin"},
    {"key": "password", "value": "password"}
  ],
  "collector": "default"
}
修改监控
@PutMapping
@Operation(summary = "Modify an existing monitoring application", description = "Modify an existing monitoring application")
public ResponseEntity<Message<Void>> modifyMonitor(@Valid @RequestBody MonitorDto monitorDto) {
    // 验证请求数据
    monitorService.validate(monitorDto, true);
    monitorService.modifyMonitor(monitorDto.getMonitor(), monitorDto.getParams(), monitorDto.getCollector());
    return ResponseEntity.ok(Message.success("Modify success"));
}
获取监控详情
@GetMapping(path = "/{id}")
@Operation(summary = "Obtain monitoring information based on monitoring ID", description = "Obtain monitoring information based on monitoring ID")
public ResponseEntity<Message<MonitorDto>> getMonitor(
        @Parameter(description = "Monitoring task ID", example = "6565463543") @PathVariable("id") final long id) {
    // 获取监控信息
    MonitorDto monitorDto = monitorService.getMonitorDto(id);
    if (monitorDto == null) {
        return ResponseEntity.ok(Message.fail(MONITOR_NOT_EXIST_CODE, "Monitor not exist."));
    } else {
        return ResponseEntity.ok(Message.success(monitorDto));
    }
}
删除监控
@DeleteMapping(path = "/{id}")
@Operation(summary = "Delete monitoring application based on monitoring ID", description = "Delete monitoring application based on monitoring ID")
public ResponseEntity<Message<Void>> deleteMonitor(
        @Parameter(description = "en: Monitor ID", example = "6565463543") @PathVariable("id") final long id) {
    // 删除监控
    Monitor monitor = monitorService.getMonitor(id);
    if (monitor == null) {
        return ResponseEntity.ok(Message.success("The specified monitoring was not queried, please check whether the parameters are correct"));
    }
    monitorService.deleteMonitor(id);
    return ResponseEntity.ok(Message.success("Delete success"));
}

批量监控管理API

MonitorsController.java提供了批量管理监控任务的接口:

批量获取监控列表
@GetMapping
@Operation(summary = "Obtain a list of monitoring information based on query filter items",
        description = "Obtain a list of monitoring information based on query filter items")
public ResponseEntity<Message<Page<Monitor>>> getMonitors(
        @Parameter(description = "Monitor ID", example = "6565463543") @RequestParam(required = false) final List<Long> ids,
        @Parameter(description = "Monitor Type", example = "linux") @RequestParam(required = false) final String app,
        @Parameter(description = "Monitor Name support fuzzy query", example = "linux-127.0.0.1") @RequestParam(required = false) final String name,
        @Parameter(description = "Monitor Host support fuzzy query", example = "127.0.0.1") @RequestParam(required = false) final String host,
        @Parameter(description = "Monitor Status 0:no monitor,1:usable,2:disabled,9:all status", example = "1") @RequestParam(required = false) final Byte status,
        @Parameter(description = "Sort Field ", example = "name") @RequestParam(defaultValue = "gmtCreate") final String sort,
        @Parameter(description = "Sort mode eg:asc desc", example = "desc") @RequestParam(defaultValue = "desc") final String order,
        @Parameter(description = "List current page", example = "0") @RequestParam(defaultValue = "0") int pageIndex,
        @Parameter(description = "Number of list pagination ", example = "8") @RequestParam(defaultValue = "8") int pageSize,
        @Parameter(description = "Monitor tag ", example = "env:prod") @RequestParam(required = false) final String tag) {
    Page<Monitor> monitorPage = monitorService.getMonitors(ids, app, name, host, status, sort, order, pageIndex, pageSize, tag);
    return ResponseEntity.ok(Message.success(monitorPage));
}
批量删除监控
@DeleteMapping
@Operation(summary = "Delete monitoring items in batches according to the monitoring ID list",
        description = "Delete monitoring items in batches according to the monitoring ID list")
public ResponseEntity<Message<Void>> deleteMonitors(
        @Parameter(description = "Monitoring ID List", example = "6565463543") @RequestParam(required = false) List<Long> ids
) {
    if (ids != null && !ids.isEmpty()) {
        monitorService.deleteMonitors(new HashSet<>(ids));
    }
    return ResponseEntity.ok(Message.success());
}
监控配置导入导出

HertzBeat支持监控配置的导入导出功能,方便在不同环境间迁移监控配置:

@GetMapping("/export")
@Operation(summary = "export monitor config", description = "export monitor config")
public void export(
        @Parameter(description = "Monitor ID List", example = "6565463543") @RequestParam List<Long> ids,
        @Parameter(description = "Export Type:JSON,EXCEL,YAML") @RequestParam(defaultValue = "JSON") String type,
        HttpServletResponse res) throws Exception {
    monitorService.export(ids, type, res);
}

@PostMapping("/import")
@Operation(summary = "import monitor config", description = "import monitor config")
public ResponseEntity<Message<Void>> export(MultipartFile file) throws Exception {
    monitorService.importConfig(file);
    return ResponseEntity.ok(Message.success("Import success"));
}

指标数据API

指标数据是监控系统的核心产出,HertzBeat提供了多种API接口来获取和导出指标数据。

获取监控指标

MetricsController.java提供了获取系统内部指标的接口:

@GetMapping()
@Operation(summary = "Get Hertzbeat Metrics Data")
public ResponseEntity<Message<Map<String, Object>>> getMetricsInfo() {
    Map<String, Object> metricsInfo = new HashMap<>(8);
    if (commonDataQueue instanceof InMemoryCommonDataQueue dataQueue) {
        Map<String, Integer> queueInfo = dataQueue.getQueueSizeMetricsInfo();
        metricsInfo.putAll(queueInfo);
    }
    return ResponseEntity.ok(Message.success(metricsInfo));
}

获取监控指标定义

MonitorController.java提供了获取特定应用类型可监控指标的接口:

@GetMapping(value = {"/metric/{app}", "/metric"})
@Operation(summary = "get app metric", description = "Obtain indicators that can be monitored by the app based on the app name")
public ResponseEntity<Message<List<String>>> getMonitorMetrics(
        @PathVariable(value = "app", required = false) String app) {
    List<String> metricNames = monitorService.getMonitorMetrics(app);
    return ResponseEntity.ok(Message.success(metricNames));
}

状态页面API

HertzBeat提供了状态页面功能,可以将监控状态以友好的方式展示给用户。StatusPageController.java提供了相关的API接口:

@PostMapping("/org")
@Operation(summary = "Create or update status page organization information", description = "Create or update status page organization information")
public ResponseEntity<Message<StatusPageOrg>> saveStatusPageOrg(@Valid @RequestBody StatusPageOrg statusPageOrg) {
    return ResponseEntity.ok(Message.success(statusPageService.saveStatusPageOrg(statusPageOrg)));
}

@GetMapping("/org")
@Operation(summary = "Get status page organization information", description = "Get status page organization information")
public ResponseEntity<Message<StatusPageOrg>> getStatusPageOrg() {
    return ResponseEntity.ok(Message.success(statusPageService.queryStatusPageOrg()));
}

插件管理API

HertzBeat支持插件扩展,PluginController.java提供了插件管理的相关接口:

@PostMapping
@Operation(summary = "Upload plugin package", description = "Upload plugin package")
public ResponseEntity<Message<Void>> uploadPlugin(@RequestParam("file") MultipartFile file) {
    pluginService.savePlugin(file);
    return ResponseEntity.ok(Message.success("Upload success"));
}

@GetMapping
@Operation(summary = "Get plugin list", description = "Get all plugin list")
public ResponseEntity<Message<List<PluginMetadata>>> getPlugins() {
    return ResponseEntity.ok(Message.success(pluginService.getPlugins()));
}

API调用示例

下面以添加Linux监控为例,展示完整的API调用流程:

  1. 登录获取token
curl -X POST http://localhost:1157/api/account/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"hertzbeat"}'

返回结果:

{
  "code": 0,
  "msg": "success",
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expiresIn": 3600
  }
}
  1. 添加Linux监控
curl -X POST http://localhost:1157/api/monitor \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -d '{
    "monitor": {
      "name": "Linux Server",
      "app": "linux",
      "host": "192.168.1.100",
      "interval": 10,
      "timeout": 3000,
      "status": 1
    },
    "params": [
      {"key": "username", "value": "root"},
      {"key": "password", "value": "password"},
      {"key": "port", "value": "22"}
    ],
    "collector": "default"
  }'
  1. 获取监控列表
curl -X GET "http://localhost:1157/api/monitors?app=linux" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

二次开发最佳实践

API版本控制

HertzBeat的API目前没有显式的版本控制,但为了保证兼容性,建议在二次开发时注意以下几点:

  1. 密切关注官方发布的更新日志,了解API变更情况
  2. 在调用API时,尽量指定具体的参数,避免依赖默认值
  3. 实现API调用的错误处理机制,当API变更时能够及时发现

性能优化

  1. 批量操作优先:对于大量监控任务的管理,优先使用批量API,减少请求次数
  2. 合理设置分页:获取监控列表时,使用分页参数控制返回数据量
  3. 异步处理:对于耗时操作(如批量导入导出),采用异步方式处理

安全性考虑

  1. HTTPS:生产环境中务必启用HTTPS,保护API通信安全
  2. 权限控制:根据实际需求为不同用户分配适当的API访问权限
  3. 请求频率限制:实现API请求频率限制,防止恶意请求攻击

总结

Apache HertzBeat提供了全面的RESTful API接口,覆盖了监控管理、指标收集、状态页面、插件管理等各个方面。通过这些API,开发者可以灵活地扩展HertzBeat的功能,实现自定义的监控需求。

官方文档:home/docs/

API源码:manager/src/main/java/org/apache/hertzbeat/manager/controller/

社区教程:README.md

希望本文能够帮助开发者更好地理解和使用HertzBeat的API接口,开发出更强大的监控解决方案。如有任何问题,欢迎在社区交流讨论。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值