当 dotnet-monitor 遇上 Prometheus, 是种什么样的体验?

对于开发和运维人员来说, 监控大屏很棒, 让我们来做一个 Dashboard 吧! 大家可能听说过一些 CLI 诊断工具, 比如 dotnet-counters,dotnet-dump 和 dotnet-trace, 那 dotnet-monitor 又是什么呢?简单理解就是把上面的几种诊断工具进行了包装, 并且暴露了 对应的 REST API, 让诊断变的更容易, 在去年, dotnet-monitor 还是一个实验性的诊断工具, 当时我也写了一篇文章介绍 dotnet-monitor, 使用 dotnet-monitor 分析.NET 应用程序, 而最近, .NET 团队宣布第一个 release 版本的 dotnet-monitor, 同时它也是 .NET 6 的内容 , 也就是 dotnet-monitor 6.0.0 !
今天我们关注的主要是指标, 也就是 /metrics 端点, 正如文档所说,它是按照 Prometheus 的格式显示当前dotnet程序的 metrics 快照, 顺便说一句,这是非常简单的格式,如下:
# HELP systemruntime_cpu_usage_ratio CPU Usage
# TYPE systemruntime_cpu_usage_ratio gauge
systemruntime_cpu_usage_ratio 0 1632929076109
systemruntime_cpu_usage_ratio 0 1632929076111
systemruntime_cpu_usage_ratio 0 1632929086110
# HELP systemruntime_working_set_bytes Working Set
# TYPE systemruntime_working_set_bytes gauge
systemruntime_working_set_bytes 1529000000 1632929066112
systemruntime_working_set_bytes 1529000000 1632929076110
systemruntime_working_set_bytes 1529000000 1632929076112
...
# HELP systemruntime_time_in_gc_ratio % Time in GC since last GC
# TYPE systemruntime_time_in_gc_ratio gauge
systemruntime_time_in_gc_ratio 0 1632929066112
systemruntime_time_in_gc_ratio 0 1632929076110
systemruntime_time_in_gc_ratio 0 1632929076112
上面看到的是 System.Runtime counters 的指标, 接下来,我们需要把这些信息展示到 Grafana Dashboard。
1. 准备一个 dotnet core 应用
为了更好的展示, 这里我们使用了一个内存泄露的示例项目, 这是一个.NET 5 的应用, 你可以在github上面找到,然后下载到本地
https://github.com/sebastienros/memoryleak
git clone https://github.com/sebastienros/memoryleak.git
接下来, 我们让应用在 docker 容器中运行, 这里准备了一个 Dockerfile 文件, 你需要把它手动添加到项目的解决方案目录下
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source
COPY . .
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
RUN apt-get update && apt-get install -y procps
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MemoryLeak.dll"]

然后构建镜像
docker build --pull -t memoryleak-image -f Dockerfile .
因为我们的 dotnet-monitor 是在 sidecar 容器运行的, 所以需要共享 volume (用于 IPC 通信), 使用以下命令创建一个 volume
docker volume create dotnet-tmp
现在我们准备运行我们的 memoryleak 镜像, 然后映射端口 80 ---> 5000
docker run -d -it --rm -e TZ=Asia/Shanghai -p 5000:80 --mount "source=dotnet-tmp,target=/tmp" memoryleak-image
运行成功后, 访问 http://localhost:5000/

2. dotnet-monitor
我们可以安装 dotnet-monitor 为全局工具,但让我们继续使用 Docker 容器, Microsoft Container Registry 上有可用的容器映像,只需要使用以下命令即可:
docker run -d -it --rm -e TZ=Asia/Shanghai -p 12323:52323 --mount "source=dotnet-tmp,target=/tmp" mcr.microsoft.com/dotnet/monitor --urls http://*:52323 --no-auth
同样, 挂载了我们上面创建的 dotnet-tmp volume, 然后访问 http://localhost:12323/metrics, 现在已经能看到指标信息了

3. Prometheus
Prometheus 是一个免费的监控系统和时序数据库, 我们需要存储 dotnet-monitor 收集的 metrics 指标信息, 同样,我们可以通过各种方式运行/安装 Prometheus,这里我们还继续使用 Docker, 首先还需要一个 prometheus.yml 配置文件, 你可以手动添加到解决方案目录下
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
alerting:
alertmanagers:
- scheme: http
timeout: 10s
api_version: v1
static_configs:
- targets: []
scrape_configs:
- job_name: prometheus
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- localhost:9090
- job_name: memoryleak
honor_timestamps: true
scrape_interval: 2s
scrape_timeout: 2s
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- host.docker.internal:12323

上面配置中, 定时 2s 抓取了 http://host.docker.internal:12323/metrics , 这是 dotnet-monitor 暴露的指标信息, 然后使用下边的命令, 在 docker 中启动 prometheus, 注意 D:\Code\dotnet\memoryleak\src\MemoryLeak\prometheus.yml 这里要改成你本地 prometheus.yml 文件路径。
docker run -d --name prometheus-container -e TZ=Asia/Shanghai -p 30090:9090 -v D:\Code\dotnet\memoryleak\src\MemoryLeak\prometheus.yml:/etc/prometheus/prometheus.yml ubuntu/prometheus
就是这么简单, Prometheus 运行后, 我们访问 http://localhost:30090/targets, 查看运行状态, 一切 OK

4. Grafana
最后, 就是用 Grafana 做可视化, 同样, 我们使用下面的命令在docker中运行 Grafana
docker run -d -e TZ=Asia/Shanghai -p 3000:3000 grafana/grafana
接下来, 我们访问 http://localhost:3000/, 首次登录可以使用 admin/admin, 然后转到 Configuration -> Data sources, 点击 Add data source 添加数据源, 选择 Prometheus, 然后设置 URL 为 http://host.docker.internal:30090/, 其他的参数默认, 然后 Save & test 保存, 如下


现在数据源设置好了, 接下来还需要配置 dashboard , 这里有一个json文件, 你可以直接复制内容到文本框并导入, 如下
https://dotnetos.org/assets/files/posts/sample-dotnet-monitor-dashboard.json

恭喜, 现在你已经有一个看上去很nice的仪表盘!

总结
我们回顾一下整个过程, 总共有4个容器, 首先是 .NET 5 的应用, 然后 dotnet-monitor 收集应用的指标信息, Prometheus 定时拉取并存储 dotnet-monitor 的 metrics, 最后用 Grafana 进行可视化。
原文链接: https://dotnetos.org/blog/2021-11-22-dotnet-monitor-grafana/

当 dotnet-monitor 遇上 Prometheus, 是种什么样的体验?的更多相关文章
- 【翻译】.NET 6 中的 dotnet monitor
原文:Announcing dotnet monitor in .NET 6 我们在 2020 年 6 月首次推出了dotnet monitor 作为实验工具,并在去年(2020年)努力将其转变为生产 ...
- SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案
SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(中) (转发)
当DiscuzNT遇上了Loadrunner(中) 在上文中,介绍了如果录制脚本和设置脚本执行次数.如果经过调试脚本能够正常工作的话,就可以设置并发用户数并进行压力测试了. 首先我们通过脚本编辑界面上 ...
- 当KDS晶振遇上爱普生晶振国内生产厂家该如何抉择?
当KDS晶振遇上爱普生晶振国内生产厂家该如何抉择? 全球做晶振行业的公司有很多,单说深圳一个城市就有几十上百家正规的晶振厂家,深圳市金洛电子就是其中之一.我们不光代理日本和台湾多家排得上名 ...
- 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署
谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...
- dynamic遇上ADO.NET
传说中的dynamic dynamic是个不合群.不按规则办事的家伙,可以说是个异形,但更恐怖的是它又是无所不知的,任何事情都难不了它(咳咳,它似乎与Lambda表达式是死对头).这令人想起<死 ...
- 前端遇上Go: 静态资源增量更新的新实践
前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...
- 推荐系统遇上深度学习(十)--GBDT+LR融合方案实战
推荐系统遇上深度学习(十)--GBDT+LR融合方案实战 0.8012018.05.19 16:17:18字数 2068阅读 22568 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模 ...
- 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务
小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...
随机推荐
- C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>.<C#开发BI ...
- javascriptRemke之类的继承
前言:es6之前在js中要实现继承,就必须要我们程序员在原型链上手动继承多对象的操作,但是结果往往存在漏洞,为解决这些问题,社区中出现了盗用构造函数.组合继承.原型式继承.寄生式继承等一系列继承方式, ...
- (课内)信安数基RSA-level1&&2
注:(不求甚解的)攻击原理 以及(浅层的)算法解释已在图片中给出:文字部分主要讲一些python语法的东西. 代码需要库 gmpy2和libnum:加密算法还需要Crypto.Util.number ...
- 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树
解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...
- [软工顶级理解组] Alpha阶段事后分析
目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 质量提高 会议截图 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰 ...
- [源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构
[源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构 目录 [源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构 0x00 摘要 0x01 Engine ...
- 2021.10.15考试总结[NOIP模拟77]
\(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...
- 『学了就忘』Linux基础 — 10、VMware虚拟机中克隆的使用
目录 1.什么是克隆 2.克隆的两种类型 (1)完整克隆 (2)链接克隆 3.克隆操作 步骤一:克隆虚拟机 步骤二:进行克隆导向 3.快照与克隆的区别 4.镜像的管理 快照和克隆是VMware中两个非 ...
- 对SQLServer错误使用聚集索引的优化案例(千万级数据量)
前言: 半个月前发了文章 SQLServer聚集索引导致的插入性能低 终于等到生产环境休整半天,这篇文章是对前文的实际操作. 以下正文开始: 异常:近期发现偶尔有新数据插入超时. 分析:插入条码有多种 ...
- 嵌入式开发板nfs挂载
板子要开始调试了,第一个头大的问题就是调试过程中更新的文件怎么更新到板子上,以前用sd卡拷贝来来回回太浪费时间了,adb也需要接线各种连接操作. 现在板子有wifi可用,是时候把nfs共享搭起来了. ...