基于Prometheus的.NET 4.x应用服务监控

Why 监控?

Edison所在团队95%以上的应用都是基于.NET 4.5开发的,只能跑在Windows Server服务器上的IIS中,公司运维也没有意愿对Windows Server进行有效的管理和提供监控支持,整得我们无法及时查看有效的性能状况(老实说,之前啥都没有)。

因此,我们需要自行搭建一套适合.NET 4.5应用的监控环境,Prometheus是首选。.

准备工作

下载Prometheus:https://prometheus.io/download/,最新版本:2.33.3

基于Prometheus的.NET 4.x应用服务监控

下载Grafana:https://grafana.com/grafana/download,最新版本:8.3.6

基于Prometheus的.NET 4.x应用服务监控

下载Windows Exporter:https://github.com/prometheus-community/windows_exporter/releases,最新版本:0.18.1,建议选择msi安装文件。

基于Prometheus的.NET 4.x应用服务监控

Note:针对Windows Server服务器,请选择对应的Windows版本(amd64后缀)下载安装。

Prometheus服务搭建

第一步,安装Prometheus Windows版本,假设这里安装在192.168.80.100服务器上。

第二步,打开prometheus.yml配置文件,将需要监控的服务器添加到配置文件中,假设我们需要对192.168.80.1 ~ 10 共计10台机器进行监控。这里我加了一些label,便于后续我进行筛选。

# my global config
global:
  scrape_interval: 60s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 60s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

.....

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "Prometheus-Service"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["192.168.80.100:9090"]

  - job_name: 'Application-Server-Host'
 
    static_configs:
      - targets: ['192.168.80.1:9182','192.168.80.2:9182','192.168.80.3:9182','192.168.80.4:9182']
        labels:
          type: Windows-Server
          status: InUse
          group: BIZ-PURCHASER
          
      - targets: ['192.168.80.5:9182','192.168.80.6:9182','192.168.80.7:9182','192.168.80.8:9182']
        labels:
          type: Windows-Server
          status: InUse
          group: BIZ-SUPPLIER

      - targets: ['192.168.220.9:9182','192.168.220.10:9182']
        labels:
          type: Windows-Server
          status: InUse
          group: BIZ-JOB

第三步,双击prometheus.exe启动(不推)。

第四步,将prometheus.exe注册为windows服务,开机自启动(推荐),可选方式:借助NSSM将exe配置为Windows服务。

第五步,在本地浏览器访问 http://localhost:9090 进行验证,能够正常访问就说明安装并启动成功。

Windows Exporter安装配置

由于Windows Exporter默认并没有设置收集IIS和TCP连接数据,因此我们需要在安装目录下执行以下下面的命令:

msiexec /i windows_exporter-0.18.1-amd64.msi ENABLED_COLLECTORS=cpu,cpu_info,cs,logical_disk,net,os,service,system,textfile,iis,process,memory,tcp

Windows Exporter的默认端口是9182,一般不建议修改,当然你如果想修改也可以,修改一下上面的命令增加监听端口的参数,假设改为监听8000端口:

msiexec /i windows_exporter-0.18.1-amd64.msi ENABLED_COLLECTORS=cpu,cpu_info,cs,logical_disk,net,os,service,system,textfile,iis,process,memory,tcp LISTEN_PORT=8000

执行完上面的命令之后,Windows Exporter会开始自动安装,安装完成后会注册为一个Windows服务,我们可以在Windows服务列表中找到它:

基于Prometheus的.NET 4.x应用服务监控

更多内容设置请参考:

https://github.com/prometheus-community/windows_exporter

当所有需要监控的服务器上都安装了Exporter之后,就可以通过Prometheus查看状态了:

基于Prometheus的.NET 4.x应用服务监控

基于Prometheus的.NET 4.x应用服务监控

踩坑记

在安装过程中,有一台服务器启动后报错

  • collected metric "windows_iis_worker_request_errors_total" { label:

    label:label:counter:} was collected before with the same name and label values

  • collected metric "windows_iis_worker_request_errors_total" { label:

    label:label:counter:} was collected before with the same name and label values

  • .......

发现只要加上针对iis的监控就会报如上错误,去掉就不会报错。

这个bug已经体现在了:https://github.com/prometheus-community/windows_exporter/issues/903

但是,我使用的最新版本还是没有解决这个问题。

因此,我看了一下issue中的comments,针对这台服务器将版本退回到了0.16.0版本解决了这个问题。

Grafana服务搭建

第一步,将安装包拷贝到服务器并解压,这里假设部署到192.168.80.100服务器上。

第二步,同Prometheus一样,将grafana-server.exe注册为windows服务,开机自启动(推荐),可选方式:借助NSSM将exe配置为Windows服务。

第三步,启动grafana-server.exe,可以通过访问 http://localhost:3000 进行验证,默认账号:admin/admin。

第四步,配置data source,增加Prometheus数据源。

基于Prometheus的.NET 4.x应用服务监控

基于Prometheus的.NET 4.x应用服务监控

第五步,导入dashboard模板,这里我选择了两个模板,一个是展示Windows Server主机性能指标(10467),另一个则展示IIS应用站点的性能指标(13610)。

基于Prometheus的.NET 4.x应用服务监控

基于Prometheus的.NET 4.x应用服务监控

点击Import即可完成dashboard导入。

更多dashboard请参考:

https://grafana.com/grafana/dashboards

监控面板体验

Windows Server主机监控

该面板主要针对服务器主机的各项性能指标进行监控展示,主要包括:CPU使用率、内存使用率、磁盘IO、网络读写情况等。

基于Prometheus的.NET 4.x应用服务监控

IIS .NET应用监控面板

该面板主要针对服务器主机上部署的IIS应用站点的各项性能指标进行监控展示,主要包括:TCP连接数、总体HTTP请求率、请求用户数等。

基于Prometheus的.NET 4.x应用服务监控

基于Prometheus的.NET 4.x应用服务监控

总结

本文介绍了如何基于Prometheus+Grafana+Windows Exporter监控Windows Server服务器及IIS的.NET应用,除此之外,还可以基于altermanager构建报警机制,实现自定义报警规则及时通知(通过email或钉钉等)。这里由于我司运维已经构建了,我就没有重复搭了。