Nancy模块性能监控指南:Metrics.NET的Nancy.Metrics适配器与NLog指标输出实战
【免费下载链接】Metrics.NETThe Metrics.NET library provides a way of instrumenting applications with custom metrics (timers, histograms, counters etc) that can be reported in various ways and can provide insights on what is happening inside a running application.项目地址: https://gitcode.com/gh_mirrors/me/Metrics.NET
Metrics.NET 是一个 .NET 应用性能监控库,其中的Nancy.Metrics 适配器可以将 Nancy Web 框架的每次请求自动采集为指标(请求耗时、错误率、活跃连接数等),而Metrics.NLog 适配器则支持把这些指标通过 NLog 日志框架定期输出为 CSV 文件或文本日志。本文将带你快速完成这两项能力的接入,让 Nancy 应用的运行状态一目了然。
为什么需要给 Nancy 应用做指标监控?
线上服务常见的"玄学"问题——某个接口偶尔变慢、某类请求错误率飙升、并发升高后响应时间翻倍——靠肉眼翻日志很难发现规律。
Metrics.NET 的思路是:用极低开销的埋点持续记录数字,再由各种报告器(Reporter)周期性输出。对于 Nancy 应用,适配器已经帮你把最常用的埋点都写好了,一行配置即可启用。
快速上手:3 步接入 Nancy.Metrics 适配器
核心配置在 Nancy 的 Bootstrapper 中完成,调用链非常简洁(示例见 Samples/NancyFx.Sample/SampleBootstrapper.cs):
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines) { base.ApplicationStartup(container, pipelines); Metric.Config .WithReporting(r => r.WithNLogCSVReports(TimeSpan.FromSeconds(5))) // NLog 指标输出 .WithNancy(pipelines); // 启用 Nancy 适配器 }第 1 步:调用WithNancy(pipelines)挂接 Nancy 流水线(pipeline),自动注册全部全局指标,实现位于Src/Adapters/Nancy.Metrics/NancyMetrics.cs;
第 2 步:它会同时自动注册/metrics端点模块(Src/Adapters/Nancy.Metrics/MetricsModule.cs),无需额外编写 Controller;
第 3 步:配置报告器。本文重点演示 NLog 方式(下一节),也可以换成WithConsoleReport、CSV 文件、Graphite、InfluxDB 等。
如果想精细控制启用哪些指标,可以传入配置回调:
Metric.Config .WithNancy(pipelines, nancy => nancy .WithNancyMetrics(m => m.WithAllMetrics()) // 或按需只启用部分指标 .WithMetricsModule()); // 暴露 /metrics 端点内置的 5 类 Nancy 请求性能指标
WithAllMetrics()一次注册 5 种指标,全部定义在Src/Adapters/Nancy.Metrics/NancyGlobalMetrics.cs:
| 指标名 | 类型 | 监控内容 |
|---|---|---|
NancyFx.Requests | Timer | 每秒请求数 + 请求耗时分布 |
NancyFx.Errors | Meter | 未处理异常的频率 |
NancyFx.ActiveRequests | Counter | 当前正在处理的请求数 |
NancyFx.Post&PutRequestSize | Histogram | POST/PUT 请求体大小分布 |
GET /item/{id}等路由名 | Timer | 每个路由单独的耗时统计 |
其中"按路由计时"特别实用——每个请求会按其匹配到的路由自动归入名为GET /test这样的独立 Timer,方便你直接对比各接口的 P95、P99 延迟。
此外,Src/Adapters/Nancy.Metrics/NancyModuleMetricExtensions.cs还提供了模块级扩展方法,可对指定路由做更细粒度的埋点:
// 在 NancyModule 构造函数中 this.MetricForRequestTimeAndResponseSize("TestRequest", "Get", "/test"); this.MetricForRequestSize("TestRequestSize", "Post", "/action");更多用法可参考Samples/NancyFx.Sample/SampleModule.cs。
实时查看指标:/metrics 端点
启用后,浏览器直接访问应用即可看到数据(Src/Adapters/Nancy.Metrics/MetricsModule.cs):
/metrics— 内置 Flot 图表可视化页面(自动 gzip 压缩)/metrics/json— 标准 JSON 格式,可对接第三方系统/metrics/v2/json— V2 版 JSON/metrics/text— 人类可读文本/metrics/health— 健康检查结果(不健康时返回 HTTP 500)/metrics/ping— 存活探测
如果需要加认证,可以这样配置(Src/Adapters/Nancy.Metrics/NancyMetricsConfig.cs):
.WithMetricsModule(m => m.RequiresAuthentication())NLog 指标输出实战:定期写入 CSV 文件
这是本文的重点。Metrics.NLog 适配器(Src/Adapters/Metrics.NLog/)让指标可以借用 NLog 强大的目标配置能力——按指标类型分文件、自动滚动归档。
1. 注册 NLog 报告器
扩展方法在Src/Adapters/Metrics.NLog/NLogReportsConfigExtensions.cs,两种形式:
// 按类型输出 CSV:Gauge / Counter / Meter / Histogram / Timer 各写一份 .WithNLogCSVReports(TimeSpan.FromSeconds(5)) // 输出人类可读文本 .WithNLogTextReports(TimeSpan.FromSeconds(30))工作原理:适配器把每种指标注册为 NLog 自定义 Layout(如CsvTimerLayout,见Src/Adapters/Metrics.NLog/CsvMetricLayout.cs),并通过Src/Adapters/Metrics.NLog/NLogCSVAppender.cs把 CSV 行写进日志事件;NLogTextReporter.cs则把每行文本挂到Metrics.Text.{类型}.{指标名}这类 logger 名上。
2. 配置 NLog 目标与规则
参考项目自带示例Samples/Metrics.SamplesConsole/NLog.config,关键片段:
<variable name="LogDir" value=".\Logs"/> <variable name="MetricType" value="${event-context:item=MetricType}"/> <variable name="MetricName" value="${event-context:item=MetricName}"/> <target xsi:type="File" name="Metrics.CSV.Timer" fileName="${LogDir}/Metrics.CSV.${MetricType}.${MetricName}.csv" archiveAboveSize="10485760" archiveNumbering="Rolling"> <layout xsi:type="CsvTimerLayout"/> </target> <rules> <logger name="Metrics.CSV.Timer.*" minlevel="Info" writeTo="Metrics.CSV.Timer" /> </rules>效果:每个指标都会单独生成一个 CSV 文件(如Logs/Metrics.CSV.Timer.Requests.csv),文件超过 10MB 自动滚动归档。你可以把Rules中其他类型(Gauge/Counter/Meter/Histogram)的注释一并放开,即可全量落盘。
💡 小技巧:NLog 事件属性
MetricType/MetricName就是适配器在日志事件中注入的,因此路由到不同目标文件完全由 NLog 规则驱动,无需写一行代码。
相关文件速查
| 模块 | 路径 |
|---|---|
| Nancy 适配器入口 | Src/Adapters/Nancy.Metrics/NancyMetrics.cs |
| Nancy 全局指标定义 | Src/Adapters/Nancy.Metrics/NancyGlobalMetrics.cs |
| 指标端点模块 | Src/Adapters/Nancy.Metrics/MetricsModule.cs |
| 模块级埋点扩展 | Src/Adapters/Nancy.Metrics/NancyModuleMetricExtensions.cs |
| NLog 报告器扩展 | Src/Adapters/Metrics.NLog/NLogReportsConfigExtensions.cs |
| NLog CSV 布局 | Src/Adapters/Metrics.NLog/CsvMetricLayout.cs |
| Nancy 示例工程 | Samples/NancyFx.Sample/ |
| NLog 配置示例 | Samples/Metrics.SamplesConsole/NLog.config |
总结
- 一行
WithNancy(pipelines)即可让 Nancy 应用获得请求耗时、错误率、活跃请求数等开箱即用的性能监控; /metrics端点提供可视化页面与 JSON 接口,方便排障和对接监控体系;- 借助
WithNLogCSVReports,指标可按指标名自动分文件写入 CSV 并滚动归档,是 .NET 老项目中零依赖落盘指标的低成本方案; - 需要更多输出渠道(Graphite、InfluxDB、ElasticSearch 等),可继续探索
Src/Metrics/下的其他报告器。
现在打开你的 Nancy 项目,把埋点加上吧!
【免费下载链接】Metrics.NETThe Metrics.NET library provides a way of instrumenting applications with custom metrics (timers, histograms, counters etc) that can be reported in various ways and can provide insights on what is happening inside a running application.项目地址: https://gitcode.com/gh_mirrors/me/Metrics.NET
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考