无需Azure监控工具 用Prometheus&Grafana监控Azure App Service
完全可以实现,不需要在App Service实例上手动安装Prometheus agent,也不需要走Application Insights、Azure Monitor这类原生监控链路,以下是经过生产验证的可行路径:
方案1:应用内嵌Prometheus指标端点(优先推荐,链路最短)
这是最直接、开销最低的方案,完全适配PaaS场景的限制:
- 给你的业务应用集成对应技术栈的Prometheus客户端SDK,在应用内开放标准的
/metricsHTTP端点,直接输出运行时指标、自定义业务指标 - 不需要对App Service做任何底层修改,只要保证
/metrics路由能被正常访问即可:你可以给这个端点配置独立的鉴权逻辑,比如加IP白名单只允许你的Prometheus服务IP访问、或者加固定API Key做校验,避免指标端点公网暴露 - Prometheus侧直接在scrape_configs里配置App Service的访问地址+
/metrics路径,就能完成拉取 - 多实例部署注意:如果App Service开了多副本,先关闭ARR粘性会话配置,拉取时带上
X-ARR-INSTANCEID请求头指定访问具体实例,避免所有拉取请求被负载均衡转发到单台实例,导致指标漏采。
这个方案能覆盖的指标包括:应用运行时指标(GC情况、内存占用、线程数、进程CPU占比)、业务自定义指标(接口耗时、设备在线状态、业务处理成功率)、Web服务层面指标(请求量、错误码分布、响应延迟)。
方案2:自定义站点扩展部署轻量Exporter(适合无法修改业务代码的场景)
如果你部署的是第三方打包的应用,没法改代码加/metrics端点,可以用App Service的自定义站点扩展能力实现采集:
- 自己打包一个轻量的指标采集Exporter,做成App Service自定义站点扩展包,上传到你的App Service启用即可
- 这个扩展会随App Service实例一同启动,运行在和业务应用同一个沙箱环境里,可以直接读取App Service本地诊断管道暴露的实例运行数据(CPU、内存、磁盘IO、网络流量、站点请求统计),对外暴露标准Prometheus指标端点
- 全程不需要修改业务代码,也不需要把任何监控数据上传到Azure的监控服务,Prometheus直接拉取扩展暴露的
/metrics端点即可。
如果觉得做自定义扩展麻烦,也可以开启App Service的日志输出到同VNet下你自己可控的采集服务,在采集服务里部署prometheus-pushgateway,把日志解析后转换成Prometheus指标格式供Prometheus拉取,只是这种方式的指标精度、实时性比直接读本地诊断管道稍差。
方案3:内网传输安全配置(适合高安全要求场景)
如果你的Prometheus部署在内网,不希望指标走公网传输,可以开启App Service的VNet集成能力,把App Service接入和Prometheus相同的虚拟网络,同时配置App Service的访问限制规则,只放行VNet内Prometheus服务的访问请求,全程指标走内网链路,不需要暴露公网端点,也不会经过Azure原生监控的中转链路。
注意:如果需要采集App Service平台侧管控的事件类数据(比如平台触发的实例重启、平台侧的部署失败记录、硬件故障迁移记录),这类数据不会暴露到应用运行的沙箱环境内,如果完全绕过Azure原生监控链路是无法直接获取的,这类事件可以通过在应用内加健康检查逻辑主动上报到Prometheus,不需要依赖平台侧数据。
内容的提问来源于stack exchange,提问作者prabhat ranjan

