基于Prometheus和Grafana打造业务监控看板

前言

业务监控对许许多多的场景都是十分有意义,业务监控看板可以让我们比较直观的看到当前业务的实时情况,然后运营人员可以根据这些情况及时对业务进行调整操作,避免业务出现大问题。

老黄曾经遇到过一次比较尴尬的“事故”。

其中一条业务线,服务着的其中一个商家,把大部分流量切到另外一个地方去了,而我们的运营人员在当天却是完全不知情,第二天看了昨天的统计报表之后才发现这个商家的量少了很多,才能跟进协调处理。

ps: 当时实时报表比较欠缺,都是第二天凌晨生成昨天的数据报表,也没有告警机制。

后面就弄了个大屏幕做了业务监控的实时看板,看一眼就知道有什么风吹草动了。

先来看一下最终的效果图。

这个图里面主要包含了下面几个内容。

  1. 总的订单数量

  2. 退单的数量

  3. 创建订单的频率

  4. 不同渠道的订单量

  5. 不同渠道的退单量

下面就介绍一下如何实现这样的业务监控。

搭建基础设施

这里涉及的基础设施就有两个,一个是prometheus,另一个是grafana。

先启动prometheus,这里直接用docker启动。

$base = Split-Path -Parent $MyInvocation.MyCommand.Definition
$prometheusyml = Join-Path $base prometheus.yml
$fileconfig = Join-Path $base "config"write-host $prometheusyml
write-host $fileconfigdocker run `--name prom `-p 9090:9090 `-v ${prometheusyml}:/etc/prometheus/prometheus.yml `-v ${fileconfig}:/etc/prometheus/fileconfig `prom/prometheus:v2.20.1

下面是prometheus.yml

global:scrape_interval:     15s evaluation_interval: 15salerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093rule_files:scrape_configs:- job_name: 'file_ds'file_sd_configs:- refresh_interval: 10sfiles:- ./fileconfig/*.yml

这里用了基于文件的发现机制,没有用静态的。更多其他方式,参见  https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config

这个时候prometheus已经是运行起来了。

再来就是grafana了,启动这个更加简单。

docker run -d --name grafana -p 3000:3000 grafana/grafana:7.1.3

执行完,访问 localhost:3000 就可以看到登录界面了。

确定业务指标(metrics)

确定指标可以说是整个业务监控中最最最最最为主要的一个环节了,只有明确了我们要监控什么,我们才可以在业务上去进行埋点,拿到想要的数据。

这个其实和我们平时面对的需求是一个样的,需求明确了,做出来的东西才可能是我们想要的,需求不明确,做出来的东西可能就不会是我们想要的了。

为了帮助大家简单的理解相关的内容,这里举个监控的例子,监控不同渠道的下单和退单量。

涉及到量的,在一天内基本上是属于只增不减的,这个时候我们一般会选用 counter 类型来处理。

一个是下单,一个是退单,所以这里定义两个

  • yyyorder_created_total

  • yyyorder_canceled_total

counter类型的,一般在命名的时候最好都用_total作为结尾。

还有不同渠道呢?

渠道我们就用 lable 来标识一下。

最后展现格式大致如下:

yyyorder_created_total{appkey="mt",opreator="cw"} 1
yyyorder_canceled_total{appkey="pdd",opreator="cw"} 2

这里也要注意一个问题,确定指标的时候,也要避免定义太多指标出来,如果可以,考虑用label去进行区分同性质的内容。

业务埋点

在明确了业务指标之后,就要在对应的业务上去进行埋点操作,会对业务代码有一定的侵入性,当然如果业务代码写得足够好,耦合的东西少,或许可以借助AOP来埋点,从而降低侵入性。

后面就写个简单的例子来模拟业务埋点这一块。

创建一个ASP.NET Core的项目,并安装prometheus-net.AspNetCore这个nuget包。

<ItemGroup><PackageReference Include="prometheus-net.AspNetCore" Version="3.6.0" />
</ItemGroup>

其次是启用 ASP.NET Core exporter middleware

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{// 这一句。endpoints.MapMetrics();endpoints.MapControllers();});
}

最后就是埋点了。

[ApiController]
[Route("")]
public class HomeController : ControllerBase
{private static readonly Counter OrderCreatedCount = Metrics.CreateCounter("yyyorder_created_total", "Number of created orders.", new CounterConfiguration{LabelNames= new [] { "appkey", "opreator" }});private static readonly Counter OrderCanceledCount = Metrics.CreateCounter("yyyorder_canceled_total", "Number of canceled orders.", new CounterConfiguration{LabelNames = new[] { "appkey", "opreator" }});[HttpGet]public string Get(){var appKeys = new[] { "ali", "pdd", "mt" };var opreators = new[] { "cw", "pz" };var rd = new Random((int)DateTimeOffset.Now.ToUnixTimeMilliseconds()).Next(0, 2000);var appKeyidx = rd % 3;var opreatoidx = rd % 2;OrderCreatedCount.WithLabels(appKeys[appKeyidx], opreators[opreatoidx]).Inc();var cRd = new Random((int)DateTimeOffset.Now.ToUnixTimeMilliseconds()).NextDouble();if (cRd < 0.3d){OrderCanceledCount.WithLabels(appKeys[appKeyidx], opreators[opreatoidx]).Inc();}return "ok";}
}

上面这个控制器中,创建了两个Counter,就是上面确定业务指标中定义好的。

这里是每访问一次,就创建一个订单,同时生成一个随机数,如果是小于0.3,那么就当它是退单的,这样就可以把两种指标都模拟出来了。

程序刚启动是有部分默认指标的。

当我们访问埋点的地址后,可以发现我们自定义的业务指标也已经有数据了。

到这里,数据已经有了,我们要怎么呈现呢?

要想呈现数据,我们需要先让prometheus来保存我们的业务指标数据。

数据写入

把数据写入prometheus有两种方式,一种是pull,一种是push。

pull是让prometheus主动去拉取我们产生的数据,只要我们暴露一个地址出来即可,这种也是比较推荐的做法。

push方式要借助pushgateway,埋点数据要先主动推送到pushgateway,后面在由pushgateway把数据写进prometheus。

默认情况下,当我们用了endpoints.MapControllers();之后,就会把数据暴露在 http://ip:port/metrics 这个地址上。

知道要用pull的方式后,还要做什么呢?当然就是要去配置promethues了。

前面我们的 scrape_configs 是通过文件去自动发现的,所以只要在挂载的路径上面加一个对应的yml文件就可以了。

老黄这里加了一个nc-service.yml,具体内容如下:

- labels:service: ncproject: demotargets: - 192.168.1.103:9874- 192.168.1.103:9875

这个时候就可以在Targets里面看到我们这两个地址的信息了。

通过prometheus的默认界面,也可以发现数据已经正常读取了。

后面就是真正的数据查询和展示了。

数据展示

通过上面的步骤,我们已经保证数据可以正常写入和查询了,现在就在grafana中创建一个业务监控看板了。

在grafana中先配置我们的数据源。

这里填上我们prometheuse的地址保存就可以了,可以看到那个绿色的提示,告诉我们这个数据源是正常工作的了。

先来一个总的订单数。

创建一个新的dashboard,再创建一个Panel。

我们在panel中填写我们的信息还有就是选择要的图形。

然后就是写上查询条件,就可以看到我们要的结果了。

订单总数这个查询如下:

sum(ceil(increase(yyyorder_created_total[1d])))

里面用到了, sum、ceil、increase这三个函数。

其中 increase 是用来统计一段时间范围内的增量。后面带了 [1d] 这个范围表明这里是查看1天内的增量。

ceil是用来把increase的结果进行四舍五入的,可能有人会好奇,怎么还会要四舍五入呢?

看看下面这个图,大家就会发现,非常多的小数点。

其实这个和prometheus的统计方法是有关系的,这里不展开,先这样用着。

sum 这个是用来求和的,指标中还包含了很多label,我们还要把每个label的求和,才是真正的结果。

所以这里就得到了下面这个结果。

退单总数的查询和订单总数一样,只是把名字换成退单的即可。

sum(ceil(increase(yyyorder_canceled_total[1d])))

再来看看各渠道的订单统计。

既然是看各渠道的统计,那么这里就要用到前面定义好的label了。appkey代表的就是渠道,那么我们基于它去分一下组就可以了。

就得到下面的查询。

sum by (appkey) (ceil(increase (yyyorder_created_total[1d])))

结果如下:

同理,各渠道退单的也是一样的写法

sum by (appkey) (ceil(increase (yyyorder_canceled_total[1d])))

ps: 如果想把订单和退单的放在一个图里面,可以加多个查询。

示例如下:

现在有了所有渠道的总量,各个渠道独立的总量,那么我们有办法知道某个时间段的趋势吗?

这个是肯定有的,且听老黄慢慢道来。

有上面这个疑问,多半是经历过,某个时间段量非常多,但是有的时间段又几乎为零,玩的就是心跳呀。

我们可以把这个称之为时间段内的订单增长情况。

这里需要用到rate函数,这个就是帮助我们统计增长速率的函数。

它统计的是每秒的平均增长率,这个粒度有点太细,所以我们会在这个基础上乘以60,放大到一分钟。

然后在看它sum的结果,最后才四舍五入。

ceil(sum(rate(yyyorder_created_total[5m]) * 60))

结果如下:

从这个结果可以看出,订单大部分时间都没有增长,只在中间那个时间段,有部分单进来。

到这里主要的各个小panel已经完成了,剩下的就是在dashboard里面调整位置,大小那些了。

总结

这样打造出来的监控看板还是挺不错的,不过还是要注意下面几个问题的

  1. prometheus是把数据存储在本地的,总是会达到上限的,这里要么是定期删,要么是写到远程存储。

  2. prometheus自己独立的查询语法可能刚开始会比较不适应,查不出自己想要的结果,这里多查查资料,多实践基本问题也不大。

  3. 业务埋点这一个块,还是要尽可能的减少对现有业务代码的侵入性。

  4. 业务指标一定要确定好,不然埋点痛苦,查询也痛苦。

这里还没有涉及到告警相关的内容,后面有时间再写一个告警相关的。

文中示例代码:

https://github.com/catcherwong-archive/2020/tree/master/08/PromDemo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广西高考成绩查询2021,2021年广西高考个人排名怎么查询,广西高考成绩排名查询方法...

高考成绩公布后&#xff0c;很多家长和学生咨询我们&#xff0c;广西高考个人成绩排名位次如何查询&#xff1a;广西高考成绩排名&#xff0c;可以通过省招生考试院发布的广西一分一段表来查询&#xff0c;也可以到聚志愿网站直接输入分数查询&#xff0c;一分一段它显示每一个…

452. 用最少数量的箭引爆气球(贪心算法+思路+详解)07

一&#xff1a;题目 在二维空间中有许多球形的气球。对于每个气球&#xff0c;提供的输入是水平方向上&#xff0c;气球直径的开始和结束坐标。由于它是水平的&#xff0c;所以纵坐标并不重要&#xff0c;因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。…

10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)

一&#xff1a;题目 本题目要求编写SQL语句&#xff0c; 查询销售便携式电脑但不销售PC的厂商。 提示&#xff1a;请使用SELECT语句作答。 表结构: CREATE TABLE product ( maker CHAR(20) , --制造商model CHAR(20) NOT NULL, --产品型号type CHAR(20), …

在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入

MongoDB&#xff0c;被归类为NoSQL数据库&#xff08;其实我更觉得MongoDb是介于关系型数据库和非关系型数据库之间&#xff0c;此外&#xff0c;在我看来在很多场景中MongoDb都可以取代关系型数据库。&#xff09;&#xff0c;是一个以类JSON格式存储数据的面向文档的数据库系…

10-2 5-2 查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 (20 分)(思路加详解+测试用例)

一&#xff1a;题目 本题目要求编写SQL语句&#xff0c; 查询至少生产两种不同型号的计算机(PC或便携式电脑)且机器速度至少为133的厂商&#xff0c;输出结果按照制造商升序排列。 提示&#xff1a; 本题有三种情况: &#xff08;1&#xff09; 至少生产两种不同PC的厂商 &a…

ASP.NET Core学习资源汇总

ASP.NET Core入门学习资源汇总篇幅比較長&#xff0c;分为七个部分。&#xff08;一&#xff09;认识.NET Core&#xff08;二&#xff09;Vistual Studio安装、调试&#xff08;三&#xff09;Asp.Net Core入门指南与学习路线&#xff08;四&#xff09;入门级实战项目手册、官…

用计算机探索 按一定规律排列,探索规律练习题1

探索规律练习题1、我们平常用的数是十进制数&#xff0c;如26392103610231019100&#xff0c;表示十进制的数要用10个数码(又叫数字)&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9。在…

简单快速导出word文档

最近&#xff0c;我写公司项目word导出功能&#xff0c;应该只有2小时的工作量&#xff0c;却被硬生生的拉长2天&#xff0c;项目上线到业务正常运行也被拉长到2个星期。为什么如此浪费时间呢&#xff1f;1&#xff09;公司的项目比较老&#xff0c;采用硬编码模式&#xff0c;…

如何让多端口网站用一个nginx进行反向代理实际场景分析

前段时间公司要整合服务器资源&#xff0c;刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合&#xff0c;断断续续一个月迁移完成大概优化掉了1/3的机器&#xff0c;完成之后遇到了一些问题&#xff0c;比如曾今零零散散部署在生产上一些可视化UI&#xff1a;apollo&…

【Azure Show】|第五期(下)当下最火热的Blazor与App Service, 嘉宾闫晓迪Alan Tsai...

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第五期&#xff08;下&#xff09;&#xff0c;继上集分享彭爱华和阿法兔两位老师的跨界经验之后&#xff0c;本期我们【MVP面对面】栏目邀请到远在新西兰的微软最有价值专家闫晓迪和大家聊聊新西兰的技术生态&#xff0c;当然…

台式计算机听音乐,配置一台4000元的台式电脑,主要用于日常办公及上网查资料,听音乐,看电影及学习....

满意答案asshnjgs2014.04.02采纳率&#xff1a;44% 等级&#xff1a;9已帮助&#xff1a;861人CPU&#xff1a;Intel 赛扬D341 2.93G(散) CPU适用类型:台式CPU CPU内核:Prescott 主频(MHz):2930MHz 插槽类型:Socket 775 制作工艺(微米):0.09 微米 L2缓存(KB):256KB FSB(MHz)…

ASP.NET Core Blazor Webassembly 之 组件

关于组件现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装&#xff0c;以便复用。组件这东西对于搞.NET的同学其实并不陌生&#xff0c;以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码&#xff0c;封装业务逻辑&#xff0c;对外提供属性事件等…

122. 买卖股票的最佳时机 II008(贪心算法+思路)

一&#xff1a;题目 给定一个数组 prices &#xff0c;其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xf…

广东省计算机应用考试题,广东省计算机等级考试一级试题

广东省计算机等级考试一级试题一、理论部分 (共20分&#xff0c;每空1分)将正确答案填写在考试文件夹中“第一题答案.XLS”的Sheet1相应的位置上1. 解释程序的功能是 ( )。A解释执行高级语言源程序 B将高级语言源程序翻译成目标程序C解释执行汇编语言源程序 D将汇编语言源程序翻…

麒麟系统兼容安卓生态 弥补生态短板

日前&#xff0c;麒麟软件发布了银河麒麟操作系统最新版本V10。据媒体报道&#xff0c;麒麟软件是国内唯一一个通过CMMI5级质量评估的操作系统企业&#xff0c;在XC市场份额占有率达到70%以上。麒麟V10系统可以兼容安卓生态。集成了自研的UKUI桌面环境&#xff0c;支持多壁纸、…

763. 划分字母区间009(贪心算法+思路+详解+图示)

一&#xff1a;题目&#xff1a; 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例&#xff1a; 输入&#xff1a;S "ababcbacadefegdehijhklij" 输出…

初识ABP vNext(4):vue用户登录菜单权限

点击上方蓝字"小黑在哪里"关注我吧登录菜单权限运行测试前言上一篇已经创建好了前后端项目&#xff0c;本篇开始编码部分。开始几乎所有的系统都绕不开登录功能&#xff0c;那么就从登录开始&#xff0c;完成用户登录以及用户菜单权限控制。登录首先用户输入账号密码…

满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现

一&#xff1a;需求 1.完成一个酒店后台管理系统&#xff0c;当然只是模拟&#xff0c;在控制台就行模拟 2.实现管理人员的登录和酒店成本账单的查看&#xff0c;以及正常的点餐&#xff0c;结账和查看账单等等功能 二&#xff1a;实现的功能展示 1.用户登录&#xff08;这里…

[Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本

&#xfeff;写在前面很多neter都有在用Ocelot做Api网关&#xff0c;但是Ocelot又不像kong或者其他网关一样&#xff0c;开箱即用。它需要你单独开一个web项目来部署&#xff0c;这样很多同学都在做重复的事了。这里[Hei.Ocelot.ApiGateway] 就把这件事给做了&#xff0c;以后有…

聊聊常见的服务(接口)认证授权

&#xfeff;写在前面头发掉得多了&#xff0c;总有机会接触/调到各种各样的接口&#xff0c;各种面向Api编程实际上已经嵌入到我们的习惯中&#xff0c;没办法现在服务端通信还得是http(s)&#xff0c;其他协议还未能成为通用的。大厂的开发平台api我先不敢说&#xff0c;各种…