如何将Zabbix Agent采集的监控数据接入C# ASP.NET Web应用
Zabbix监控数据集成到ASP.NET应用实现方案
方案1:对接Zabbix Server API(推荐方案)
Zabbix Agent默认会将所有采集到的指标上报到Zabbix Server,直接对接Zabbix Server提供的官方JSON-RPC API是生产环境最优选择,不需要单独对接每台服务器的Agent,天然支持历史数据查询、批量主机指标拉取,扩展性强。
- 前置准备:Zabbix Server已正常运行,所有目标服务器的Agent已完成配置并正常上报数据,你持有Zabbix Server的可读写/只读账号,API默认访问地址为
http(s)://<Zabbix Server部署IP或域名>/zabbix/api_jsonrpc.php - 调用流程:
- 首先调用
user.login接口传入账号密码,获取授权token,后续所有接口请求都需要携带该token - 调用
host.get接口获取所有已接入的主机ID、主机名等基础信息 - 调用
item.get接口传入指定主机ID,获取该主机下所有已配置的监控项(CPU、内存、磁盘、网络等对应的key) - 调用
history.get接口传入监控项ID、时间范围参数,即可拉取对应指标的时序数据
- 首先调用
- ASP.NET集成步骤:
- 项目中引入JSON序列化组件,可直接使用.NET内置的
System.Text.Json,也可安装Newtonsoft.Json - 封装通用的Zabbix API请求方法,统一处理token自动刷新、异常重试、参数校验逻辑
- 根据你的展示需求定时拉取对应指标,存入本地数据库或缓存后返回给前端渲染,建议拉取间隔不低于30s,避免对Zabbix Server造成过大压力
- 如果需要展示多维度聚合数据,可将拉取到的原始指标做二次计算后再存储展示
- 项目中引入JSON序列化组件,可直接使用.NET内置的
方案2:直接对接Zabbix Agent(仅适合少量服务器测试场景)
如果你没有部署Zabbix Server,仅需要监控少量几台服务器,可以直接主动连接Zabbix Agent拉取实时数据:
- 前置配置:目标服务器的Zabbix Agent配置文件中开启
EnableRemoteCommands=1,Server字段添加你的ASP.NET应用服务器的IP,且放行了Agent默认端口10050的访问权限 - 实现逻辑:ASP.NET端通过TCP协议连接目标服务器的10050端口,发送对应监控项的key(比如Windows CPU使用率对应
perf_counter[\Processor(_Total)\% User Time],Linux CPU使用率对应system.cpu.util),Agent会直接返回当前实时数值 - 缺点:无历史数据存储能力,需要自行维护所有服务器的IP、监控项列表,扩展性极差,服务器数量超过5台就不建议使用
核心代码示例(ASP.NET Core 调用Zabbix API)
// Zabbix API通用请求实体 public class ZabbixApiRequest { public string Jsonrpc { get; set; } = "2.0"; public string Method { get; set; } public object Params { get; set; } public int Id { get; set; } public string Auth { get; set; } } // 登录获取授权Token public async Task<string> GetZabbixAuthTokenAsync(string apiUrl, string username, string password) { using var httpClient = new HttpClient(); var loginRequest = new ZabbixApiRequest { Method = "user.login", Params = new { user = username, password = password }, Id = 1 }; var response = await httpClient.PostAsJsonAsync(apiUrl, loginRequest); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadFromJsonAsync<JsonElement>(); return result.GetProperty("result").GetString(); } // 拉取指定主机的监控项列表 public async Task<JsonElement> GetHostItemsAsync(string apiUrl, string authToken, string hostId) { using var httpClient = new HttpClient(); var itemRequest = new ZabbixApiRequest { Method = "item.get", Params = new { hostids = hostId, output = "extend" }, Auth = authToken, Id = 2 }; var response = await httpClient.PostAsJsonAsync(apiUrl, itemRequest); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<JsonElement>(); }
注意:生产环境不要硬编码Zabbix账号密码,建议存入配置文件加密字段或密钥管理服务中,高频率拉取数据建议先做缓存,避免重复请求Zabbix Server。
内容的提问来源于stack exchange,提问作者FH337
相关产品推荐
相关产品推荐

