{"id":21310158,"url":"https://github.com/applebananamilk/winter.monitor","last_synced_at":"2026-03-06T18:07:05.598Z","repository":{"id":206691868,"uuid":"717401142","full_name":"applebananamilk/Winter.Monitor","owner":"applebananamilk","description":"简单的单体监控工具，适用于少量监控项+服务器资源少的情景。支持钉钉机器人、邮箱等通知方式。","archived":false,"fork":false,"pushed_at":"2024-07-05T08:48:10.000Z","size":161,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-15T14:34:42.906Z","etag":null,"topics":["csharp","health-check","healthcheck","json-schema","monitoring","monitoring-tool","netcore","simple"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/applebananamilk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-11T11:35:05.000Z","updated_at":"2024-07-05T08:45:29.000Z","dependencies_parsed_at":"2023-11-13T10:24:30.592Z","dependency_job_id":"94781612-7fda-42c0-8e29-8bc89c6a5aa7","html_url":"https://github.com/applebananamilk/Winter.Monitor","commit_stats":{"total_commits":13,"total_committers":2,"mean_commits":6.5,"dds":0.07692307692307687,"last_synced_commit":"12950d9ddba9384951b95e5cce95c9caae943214"},"previous_names":["applebananamilk/winter.monitor"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/applebananamilk%2FWinter.Monitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/applebananamilk%2FWinter.Monitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/applebananamilk%2FWinter.Monitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/applebananamilk%2FWinter.Monitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/applebananamilk","download_url":"https://codeload.github.com/applebananamilk/Winter.Monitor/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241962337,"owners_count":20049642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","health-check","healthcheck","json-schema","monitoring","monitoring-tool","netcore","simple"],"created_at":"2024-11-21T17:12:35.714Z","updated_at":"2026-03-06T18:07:00.564Z","avatar_url":"https://github.com/applebananamilk.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿## Winter.Monitor 📺\n\n编写 `JSON` 进行配置的单体监控告警工具，适用于少量监控项+服务器资源少的情景。\n\n支持钉钉机器人、邮箱等通知方式。\n\n### 支持的监控项\n\n- [系统](#系统监控配置)\n  - 内存\n  - 磁盘\n  - 进程\n- [数据库](#数据库监控配置)\n  - MySQL\n  - SQL Server\n  - Redis\n  - MongoDB\n- 网络\n  - [Ping](#Ping监控配置)\n  - [TCP](#TCP监控配置)\n\n### 支持的功能\n\n- [x] 告警通知（如果监控项触发阈值，则发送一条告警通知。）\n\n  ![告警通知](/assets/alarm.png)\n\n- [x] 恢复通知（如果监控项发送过告警通知，恢复服务之后会发送一条恢复通知，**发送通知的时间不代表恢复时间**。）\n\n  ![告警通知](/assets/alarm-recovery.png)\n\n- [x] 告警收敛（告警收敛是指指定时间段内的监控项告警只通知一次。）\n\n- [x] 告警静默（屏蔽指定时间段内所有或设置监控项的告警通知。）\n\n- [x] 定时报告（定时发送健康报告通知。）\n\n### 使用\n\n你可以通过克隆此仓库，运行 `tools\\Publish-And-CompressToZip.ps1` 脚本进行发布，发布之后选择需要的压缩包。\n\n也可以下载已发布的压缩包进行使用。\n\n#### 安装为服务\n\n程序集成了自安装服务功能，你可以通过下面的命令进行操作（**必须在管理员权限下执行**）。\n\n如果安装出现问题，可以看 `Logs` 文件夹中的日志进行排查。\n\n如果想要提前调试的话，可以使用 `Winter.Monitor.exe logs` 命令在控制台进行调试。\n\n##### Windows平台\n\n如果出现卡死、超时等情况，可以参考链接 [Windows中系统服务出现卡在 停止挂起、stopping、starting等状态的问题解决](https://blog.csdn.net/qq_34902590/article/details/82665584)。\n\n```bash\nWinter.Monitor.exe start // 安装并启动服务\n```\n\n```bash\nWinter.Monitor.exe stop // 停止并删除服务\n```\n\n```bash\nWinter.Monitor.exe logs // 控制台输出服务的日志\nWinter.Monitor.exe logs filter=\"key words\" // 控制台输出服务的日志\n```\n\n##### Linux平台\n\n需要安装基础依赖 `libicu` 。\n\n```bash\nsudo ./Winter.Monitor start // 安装并启动服务\n```\n\n```bash\nsudo ./Winter.Monitor stop // 停止并删除服务\n```\n\n```bash\nsudo ./Winter.Monitor logs // 控制台输出服务的日志\nsudo ./Winter.Monitor logs filter=\"key words\" // 控制台输出服务的日志\n```\n\n### 配置项说明\n\n🎉 配置项集成了 `JSON Schema` ，可以方便的对配置进行校验及提示（需要在支持的编辑器中才会生效，例如 `VS Code` 、`VS`）。\n\n```JSON\n{\n    \"$schema\": \"https://raw.githubusercontent.com/applebananamilk/winter.monitor/main/schemas/monitor-schema-v2.0.json\"\n}\n```\n\n#### 监控配置\n\n```json\n{\n    \"Monitor\": {\n        \"ServerName\": \"\",\n    \t\"PollingIntervalInSeconds\": 5\n    }\n}\n```\n\n- ServerName  : 服务器名称，如果为空则显示计算机名称。建议使用 IP+用途，例如：127.0.0.1(DB)。\n- PollingIntervalInSeconds : 轮询间隔，表示收集监控数据的执行间隔（秒），默认值 5。\n\n##### 告警配置\n\n```JSON\n{\n    \"Monitor\": {\n        \"AlarmSetting\": {\n            \"RecoveryNotification\": {\n                \"IsEnabled\": true\n            },\n            \"Convergence\": {\n                \"IsEnabled\": true,\n                \"EvalInterval\": 1800\n            },\n            \"Silence\": {\n                \"IsEnabled\": false,\n                \"MatchAll\": true,\n                \"HealthCheckNames\": [\n                    \"Process@DingTalk\"\n                ],\n                \"PeriodStart\": \"00:00:00\",\n                \"PeriodEnd\": \"23:59:59\"\n            }\n        }\n    }\n}\n```\n\n- RecoveryNotification : 恢复通知设置。\n  - IsEnabled : 是否启用，默认启用。\n- Convergence : 告警收敛设置。\n  - IsEnabled : 是否启用，默认启用。\n  - EvalInterval : 重复告警收敛周期（秒），默认值 600。\n- Silence : 告警静默设置。\n  - IsEnabled : 是否启用，默认关闭。\n  - MatchAll  : 是否对所有检查项生效，默认启用。\n  - HealthCheckNames : 生效检查名字，格式为分组@检查名字，例如：OS@Disk、Process@DingTalk。\n    - 分组名字：OS、Process、DB、Ping、Tcp。\n  - PeriodStart : 静默时段开始，默认值0:00。\n  - PeriodEnd : 静默时段结束，默认值0:00。\n\n\n##### 系统监控配置\n\n```json\n{\n    \"Monitor\": {\n        \"SystemSetting\": {\n            \"ProcessSettings\": [\n                {\n                    \"ProcessName\": \"DingTalk\"\n                }\n            ],\n            \"WarningThreshold\": {\n                \"Disk\": 90,\n                \"Memory\": 95\n            }\n        }\n    }\n}\n```\n\n- ProcessSettings : 进程监控设置。\n  - ProcessName : 进程名称，名称唯一。\n- WarningThreshold : 告警阈值。\n  - Disk : 磁盘（百分比），如果超过设置的百分之数值，则视为不健康。\n  - Memory : 内存（百分比），如果超过设置的百分之数值，则视为不健康。\n\n##### 数据库监控配置\n\n```json\n{\n    \"Monitor\": {\n        \"DatabaseSettings\": [\n            {\n                \"Name\": \"Redis\",\n                \"ConnectionString\": \"127.0.0.1:6309\",\n                \"DbType\": \"Redis\",\n                \"WarningThreshold\": {\n                    \"Timeout\": 5000\n                }\n            }\n        ]\n    }\n}\n```\n\n- Name：名称，数据库监控配置内唯一，非空。\n- ConnectionString : 连接字符串，非空。\n- DbType : 数据库类型，非空。支持：`MySQL`，`Redis`，`SqlServer`，`MongoDB`。\n- WarningThreshold ：告警阈值。\n  - Timeout : 超时时间（毫秒）。\n\n##### Ping监控配置\n\n```json\n{\n    \"Monitor\": {\n        \"PingSettings\": [\n            {\n                \"Name\": \"PingName\",\n                \"Host\": \"127.0.0.1\",\n                \"WarningThreshold\": {\n                    \"Timeout\": 2000\n                }\n            }\n        ]\n    }\n}\n```\n\n- Name : 名称，Ping监控配置内唯一，非空。\n- Host : Ping的Host地址，非空。\n- WarningThreshold ：告警阈值。\n  - Timeout : 超时时间（毫秒），默认值2000。\n\n##### TCP监控配置\n\n```JSON\n{\n    \"Monitor\": {\n        \"TcpSettings\": [\n            {\n                \"Name\": \"Zhihu\",\n                \"Host\": \"140.249.84.135\",\n                \"Port\": 443,\n                \"WarningThreshold\": {\n                    \"Timeout\": 5000\n                }\n            }\n        ]\n    }\n}\n```\n\n- Name : 名称，TCP监控配置内唯一，非空。\n- Host : Ping的Host地址，非空。\n- Port : 端口，非空。\n- WarningThreshold ：告警阈值。\n  - Timeout : 超时时间（毫秒）。\n\n#### 通知配置\n\n支持多渠道接收通知，但目前只实现了钉钉机器人、邮箱的方式。\n\n```json\n{\n    \"Notifications\": {\n        \"DingTalkRobot\": {\n            \"IsEnabled\": true,\n            \"Webhook\": \"\",\n            \"AtMobiles\": [],\n            \"IsAtAll\": false\n        },\n        \"Email\": {\n            \"IsEnabled\": false,\n            \"Host\": \"\",\n            \"Port\": 465,\n            \"UserName\": \"\",\n            \"Password\": \"\",\n            \"EnableSsl\": true,\n            \"ReceiveEmails\": \"\"\n        }\n    }\n}\n```\n\n- Notifications\n  - DingTalkRobot : 钉钉机器人配置。\n    - IsEnabled : 是否启用。\n    - Webhook : Webhook地址，为空不会发送。\n    - AtMobiles : 被@的人的手机号。\n    - IsAtAll : 是否@所有人。\n  - Email : 邮箱配置。\n    - IsEnabled : 是否启用。\n    - Host : 发送邮件服务器。\n    - Port : 端口号。\n    - UserName : 一般是邮箱完整的地址。\n    - Password : 一般是生成的**授权码**。\n    - EnableSsl : 是否启用SSL。\n    - ReceiveEmails : 接收邮箱地址，多个使用英文逗号分割”，“。\n\n#### 定时报告配置\n\n```json\n{\n    \"PeriodicReportingWorker\": {\n        \"IsEnabled\": true,\n        \"StartNow\": false,\n        \"Cron\": \"0 15 10 15 * ?\"\n    }\n}\n```\n\n- IsEnabled : 是否启用。\n- StartNow : 是否立即执行一次发送报告通知。\n- Cron : 定时通知Cron表达式，默认每月15日上午10:15触发。\n  - `0 0 15 ? * FRI` : 每个星期五的15点执行任务。\n  - `0 15 10 15 * ?` : 每个月的15号上午10点15分执行任务。\n\n\n##### 报告内容示例\n\n![报告内容](/assets/report-content.jpg)\n\n#### 配置模板\n\n```json\n{\n  \"$schema\": \"https://raw.githubusercontent.com/applebananamilk/winter.monitor/main/schemas/monitor-schema-v1.0.json\",\n  \"Monitor\": {\n    \"ServerName\": \"\",\n    \"PollingIntervalInSeconds\": 5,\n    \"AlarmSetting\": {\n      \"RecoveryNotification\": {\n        \"IsEnabled\": true\n      },\n      \"Convergence\": {\n        \"IsEnabled\": true,\n        \"EvalInterval\": 1800\n      },\n      \"Silence\": {\n        \"IsEnabled\": false,\n        \"MatchAll\": true,\n        \"HealthCheckNames\": [\n          \"Process@DingTalk\"\n        ],\n        \"PeriodStart\": \"00:00:00\",\n        \"PeriodEnd\": \"23:59:59\"\n      }\n    },\n    \"SystemSetting\": {\n      \"ProcessSettings\": [\n        {\n          \"ProcessName\": \"DingTalk\"\n        }\n      ],\n      \"WarningThreshold\": {\n        \"Disk\": 90,\n        \"Memory\": 95\n      }\n    },\n    \"DatabaseSettings\": [\n      {\n        \"Name\": \"Redis\",\n        \"ConnectionString\": \"127.0.0.1:6309\",\n        \"DbType\": \"Redis\",\n        \"WarningThreshold\": {\n          \"Timeout\": 5000\n        }\n      }\n    ],\n    \"PingSettings\": [\n      {\n        \"Name\": \"PingName\",\n        \"Host\": \"127.0.0.1\",\n        \"WarningThreshold\": {\n          \"Timeout\": 5000\n        }\n      }\n    ],\n    \"TcpSettings\": [\n      {\n        \"Name\": \"Zhihu\",\n        \"Host\": \"140.249.84.135\",\n        \"Port\": 443,\n        \"WarningThreshold\": {\n          \"Timeout\": 5000\n        }\n      }\n    ]\n  },\n  \"Notifications\": {\n    \"DingTalkRobot\": {\n      \"IsEnabled\": true,\n      \"Webhook\": \"Your webhook url.\",\n      \"AtMobiles\": [],\n      \"IsAtAll\": false\n    }\n  },\n  \"PeriodicReportingWorker\": {\n    \"IsEnabled\": true,\n    \"StartNow\": false,\n    \"Cron\": \"0 0 15 ? * FRI\"\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapplebananamilk%2Fwinter.monitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapplebananamilk%2Fwinter.monitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapplebananamilk%2Fwinter.monitor/lists"}