一、prometheus和grafana 简介

Prometheus 是继 Kubernetes 之后的第二个 CNCF “毕业” 项目,其监控理念传承于由谷歌研发的一款内部监控软件,现主要开发语言为 go,代码目前已经托管在 github 中,遵从 apache 2.0 开源协议,受欢迎的程度非常高,github 地址为:https://github.com/prometheus/。

  监控通常可以分为白盒监控和黑盒监控。

  •   白盒监控:一般是指通过监控应用程序内部的运行状态及相应的指标来判断可能会发生的问题,从而提前做出预判或者对应用程序进行相关优化。
  •   黑盒监控:监控系统或服务的运行状态,比如报错、超时等,在发生异常时做出相应处理措施。

prometheus的优势:

  • 易于管理,通俗易懂,prometheus在使用时只有一个二进制的执行文件,安装非常简单,不依赖于任何别的应用。
  •   能够轻易获取服务内部状态,比如jvm等。
  •   高效灵活的查询语句,每秒可以处理百万级的监控指标
  •   支持本地和远程存储,支持时序数据库
  •   采用http协议,默认pull模式拉取数据,也可以通过中间网关push数据(需要安装push gateway)
  •   支持自动发现(通过服务的方式进行自动发现待监控的目标,可以通过Consul实现服务发现)
  •   可扩展,支持用户自定义开发
  •   易集成,可以和grafana 快速集成。

备注:此架构图摘自prometheus官方网站

prometheus根据配置定时可以去拉取各个节点的数据,默认使用的拉取方式是pull,当然也可以支持使用pushgateway提供的push方式去获取各个监控节点的数据。将获取到的数据存入TSDB(时序型数据库),pushgateway 就是 外部的应用可以将监控的数据主动推送给pushgateway,然后prometheus 自动从pushgateway进行拉取。此时prometheus已经获取到了监控数据,可以使用内置的PromQL进行查询。它的报警功能使用Alertmanager提供,Alertmanager是prometheus的告警管理和发送报警的一个组件。prometheus原生的图标功能由于过于简单,尤其是可视化的界面比较简单,因此建议将prometheus数据接入grafana,由grafana进行统一管理。

Grafana是开源的可视化监控、数据分析利器,支持多种数据库类型和丰富的套件,目前已支持超过50多个数据源,50多个面板,17个应用程序和1700多个不同的仪表图。(本文作者:张永清,转载请注明来源博客园:https://www.cnblogs.com/laoqing/p/14538635.html)

  • 拥有快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方提供的库中包含了丰富的仪表盘插件,比如甘特图、热图、折线图、各种图表等多种展示方式。
  • 支持许多不同的时间序列数据(数据源)存储后端。每个数据源都有一个特定查询编辑器。官方支持数据源:Graphite、infloxdb、opensdb、prometheus、elasticsearch、cloudwatch,mysql ,zabbix等。每个数据源的查询语言和功能有较大差异。可以将来自多个数据源的数据组合到一个仪表板上,但每个面板都要绑定到指定的数据源中,如下图所示。

  • 告警允许将规则附加到仪表板面板上。保存仪表板时会将警报规则提取到单独的警报规则存储中,并安排它们进行评估。报警消息还能支持钉钉、邮箱等推送至移动端。
  • 支持集成丰富多样的插件,也可以支持自定义的插件开发。

二、incubator-dolphinscheduler 简介

incubator-dolphinscheduler是一个由国内公司发起的大数据领域的开源调度项目,incubator-dolphinscheduler 能够支撑非常多的应用场景,包括:

  • 以DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态
  • 支持丰富的任务类型:Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql),Python,Sub_Process、Procedure,flink,datax,sqoop,http等
  • 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作
  • 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败
  • 支持工作流全局参数及节点自定义参数设置
  • 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑
  • 支持任务日志在线查看及滚动、在线下载日志等
  • 实现集群HA,通过Zookeeper实现Master集群和Worker集群去中心化
  • 支持对Master/Worker cpu load,memory,cpu在线查看
  • 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计
  • 支持补数
  • 支持多租户
  • 支持国际化

备注:此架构图摘自社区官方网站

三、incubator-dolphinscheduler 如何快速接入到prometheus和grafana 中进行监控

1、通过prometheus中push gateway的方式采集监控指标数据。

需要借助push gateway一起,然后将数据发送到push gateway 地址中,比如地址为http://10.25x.xx.xx:8085,那么就可以写一个shell 脚本,通过crontab调度或者incubator-dolphinscheduler调度,定期运行shell脚本,来发送指标数据到prometheus中。

#!/bin/bash
failedTaskCounts=`mysql -h 10.25x.xx.xx -u username -ppassword -e "select 'failed' as failTotal ,count(distinct(process_definition_id))
as failCounts from dolphinscheduler.t_ds_process_instance where state=6 and start_time>='${datetimestr} 00:00:00'" |grep "failed"|awk -F " " '{print $2}'`
echo "failedTaskCounts:${failedTaskCounts}"
job_name="Scheduling_system"
instance_name="dolphinscheduler"
cat <<EOF | curl --data-binary @- http://10.25x.xx.xx:8085/metrics/job/$job_name/instance/$instance_name
failedSchedulingTaskCounts $failedTaskCounts
EOF

这段脚本中failedSchedulingTaskCounts 就是定义的prometheus中的一个指标。脚本通过sql语句查询出失败的任务数,然后发送到prometheus中。

然后在grafana 中就可以选择数据源为prometheus,并且选择对应的指标。

比如可以通过如下shell 脚本采集正在运行的任务数,然后通过push gateway 发送到prometheus中。(本文作者:张永清,转载请注明来源博客园:https://www.cnblogs.com/laoqing/p/14538635.html)

#!/bin/bash
runningTaskCounts=`mysql -h 10.25x.xx.xx -u username -ppassword -e "select 'running' as runTotal ,count(distinct(process_definition_id))  as runCounts from dolphinscheduler.t_ds_process_instance where state=1" |grep "running"|awk -F " " '{print $2}'`
echo "runningTaskCounts:${runningTaskCounts}"
job_name="Scheduling_system"instance_name="dolphinscheduler"
if [ "${runningTaskCounts}yy" == "yy" ];then
runningTaskCounts=0
fi
cat <<EOF | curl --data-binary @- http://10.25x.xx.xx:8085/metrics/job/$job_name/instance/$instance_name
runningSchedulingTaskCounts $runningTaskCounts
EOF

采集好了后,就可以达到如下的效果了,从这个图就可以看出每个采集到的指标随着时间的变化趋势了。

在配置好指标后,还可以配置该指标的告警,如下图所示,点击Create Alert 按钮,按照页面提示,即可以配置告警通知。

通过上述方式还可以采集到的一些其他的常见指标如下:

1)、失败的工作流实例数

failedInstnceCounts=`mysql -h 10.25x.xx.xx -u username-ppassword -e "select 'failed' as failTotal ,count(1) as failCounts from dolphinscheduler.t_ds_process_instance where state=6 and start_time>='${datetimestr} 00:00:00'" |grep "failed"|awk -F " " '{print $2}'`
echo "failedInstnceCounts:${failedInstnceCounts}"
job_name="Scheduling_system"
instance_name="dolphinscheduler"
cat <<EOF | curl --data-binary @- http://10.25x.xx.xx:8085/metrics/job/$job_name/instance/$instance_name
failedSchedulingInstanceCounts $failedInstnceCounts
EOF

2)、等待中的工作任务流数

waittingTaskCounts=`mysql -h 10.25x.xx.xx -u username -ppassword -e "select 'waitting' as waitTotal ,count(distinct(process_definition_id)) as waitCounts from dolphinscheduler.t_ds_process_instance where state in(10,11) and start_time>='${sevenDayAgo} 00:00:00'" |grep "waitting"|awk -F " " '{print $2}'`
echo "waittingTaskCounts:${waittingTaskCounts}"
job_name="Scheduling_system"
instance_name="dolphinscheduler"
cat <<EOF | curl --data-binary @- http://10.25x.xx.xx:8085/metrics/job/$job_name/instance/$instance_name
waittingSchedulingTaskCounts $waittingTaskCounts
EOF

3)、运行中的工作流实例数

runningInstnceCounts=`mysql -h 10.25x.xx.xx -u username -ppassword -e "select 'running' as runTotal ,count(1)  as runCounts from dolphinscheduler.t_ds_process_instance where state=1" |grep "running"|awk -F " " '{print $2}'`
echo "runningInstnceCounts:${runningInstnceCounts}"
job_name="Scheduling_system"
instance_name="dolphinscheduler"
if [ "${runningInstnceCounts}yy" == "yy" ];then
runningInstnceCounts=0
fi
cat <<EOF | curl --data-binary @- http://10.25x.xx.xx:8085/metrics/job/$job_name/instance/$instance_name
runningSchedulingInstnceCounts $runningInstnceCounts
EOF

2、通过grafana 直接查询dolphinscheduler自身 的Mysql数据库(也可以是别的数据库)

首先需要在grafana 中定义一个数据源,这个数据源就是dolphinscheduler自身 的Mysql数据库。

然后在grafana 中选择这个数据源,Format as 格式选择table,输入对应的sql语句。(本文作者:张永清,转载请注明来源博客园:https://www.cnblogs.com/laoqing/p/14538635.html)

比如如下sql,统计本周以及当日正在运行的调度任务的情况。

select d.*,ifnull(f.today_runCount,0) as today_runCount,ifnull(e.today_faildCount,0) as today_faildCount,ifnull(f.today_avg_timeCosts,0) as today_avg_timeCosts,ifnull(f.today_max_timeCosts,0) as today_max_timeCosts,
ifnull(g.week_runCount,0) as week_runCount,ifnull(h.week_faildCount,0) as week_faildCount,ifnull(g.week_avg_timeCosts,0) as week_avg_timeCosts,ifnull(g.week_max_timeCosts,0) as week_max_timeCosts from
(select a.id,c.name as project_name,a.name as process_name,b.user_name,a.create_time,a.update_time from t_ds_process_definition a,t_ds_user b, t_ds_project c  where a.user_id=b.id and c.id=a.project_id and a.release_state=$status) d
left join
(select count(1) as today_faildCount,process_definition_id from
t_ds_process_instance where state=6 and start_time>=DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') and  start_time<=DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') group by process_definition_id ) e  on d.id=e.process_definition_id
left join
(select count(1) as today_runCount,avg(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time)) as today_avg_timeCosts,max(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time)) as today_max_timeCosts,process_definition_id from
t_ds_process_instance  where start_time>=DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') and  start_time<=DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') group by process_definition_id ) f on d.id=f.process_definition_id
left join
(select count(1) as week_runCount,avg(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time)) as week_avg_timeCosts,max(UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time)) as week_max_timeCosts,process_definition_id from
t_ds_process_instance  where start_time>=DATE_FORMAT(SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-1), '%Y-%m-%d 00:00:00') and  start_time<=DATE_FORMAT(SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-7), '%Y-%m-%d 23:59:59') group by process_definition_id ) g
on d.id=g.process_definition_id  left join
(select count(1) as week_faildCount,process_definition_id from
t_ds_process_instance where state=6 and start_time>=DATE_FORMAT(SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-1), '%Y-%m-%d 00:00:00')  and  start_time<=DATE_FORMAT( SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-7), '%Y-%m-%d 23:59:59') group by process_definition_id ) h
on d.id=h.process_definition_id 

这些配置完后,保存就可以得到如下的表格:(本文作者:张永清,转载请注明来源博客园:https://www.cnblogs.com/laoqing/p/14538635.html)

通过类似上述方式的配置,在输入sql后,选择Graph视图时,还可以生成任务耗时的曲线图,如下所示

select (UNIX_TIMESTAMP(a.end_time)-UNIX_TIMESTAMP(a.start_time)) as timeCosts, UNIX_TIMESTAMP(a.end_time) as time   from t_ds_process_instance a,t_ds_process_definition b where end_time>=DATE_FORMAT( DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01 00:00:00')  and end_time is not null and a.process_definition_id=b.id and b.name='$process_name'

还可以支持甘特图等多种图,此处不再一一介绍了。

备注:本文同时发表在海豚调度的官方公众号中,海豚公众号连接:https://mp.weixin.qq.com/s/XmmJ_7G07yuP16NKS2c6-A

【转载】incubator-dolphinscheduler 如何在不写任何新代码的情况下,能快速接入到prometheus和grafana中进行监控相关推荐

  1. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  2. 学习在虚拟机Linux上写c语言代码

    记录第一次在虚拟机Linux上写c语言代码的过程 本次实验是在Oracle VM Virtualbox软件中创建的Linux虚拟机上实现的. 目录 1. 安装编译环境 1.1. 先打开Linux的终端 ...

  3. 优雅的写出 JavaScript 代码

    目录 前言 避免使用 js 糟粕和鸡肋 编写简洁的 JavaScript 代码 使用 ES6/ES7 新特性 Babel ESLint Prettier 采用函数式编程 优雅的敲 JS 代码的几个原则 ...

  4. 【转载文章】手把手教你写批处理______附加我的读书笔记

    https://www.w3cschool.cn/dosmlxxsc1/uebwv9.html 手把手教你写批处理 由 ✎﹏๓₯㎕ζั͡❦﹏﹏♛ 创建, 最后一次修改 2015-11-06 手把手教你 ...

  5. 【转载】教你学会看写 input 文件

    教你学会看&写 input 文件 阅读指导 https://www.jianshu.com/p/8c4d45b089b6#fnref7 本文将会涉及到以下内容: inp 文件的功能和作用(你是 ...

  6. 转载:韩卫平--程序员们,你愿意维护别人写的“烂”代码么

    韩卫平--程序员们,你愿意维护别人写的"烂"代码么? http://blog.csdn.net/akirya/archive/2009/03/11/3982139.aspx 程序员 ...

  7. 你写的ML代码占多少内存?这件事很重要,但很多人还不懂

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Tirthajyoti Sarkar 本文转载自:机器之心  ...

  8. 代码的印象派:写点好代码吧

    最近有一位猎头顾问打电话询问是否有换工作的意向,对推荐的公司和职位的描述为:"我们这里有一家非常关注软件质量的公司,在寻找一位不仅能完成有挑战的软件开发任务,并且还对代码质量有非常高追求的软 ...

  9. 【趣图】测试刚写完的代码...

    1.被老板委派接手刚刚离职同事的项目... 2.当他们要求我测试所有应用功能时 3.准备下班的时候,测试又提bug过來了- 4.使用新框架却忘记阅读文档 5.测试实习生的代码 6.网络延迟的危害.. ...

最新文章

  1. 深入理解 C 指针阅读笔记 -- 第五章
  2. c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受
  3. mysql注入提取邮件_【sql注入教程】mysql注入直接getshell
  4. range作用于对象global失败_彻底弄懂JavaScript作用域问题
  5. 服务器系统2008能升级2012吗,将 Windows Server 2008 R2 升级到 Windows Server 2012 R2
  6. java - 只输出中文, 包含中文标点符号
  7. MailMail正式发布!注册码免费发放活动开启!(已结束~~不要再回复咧~)
  8. 顶配 12699 元、没有 5G,“浴霸三摄”的 iPhone 到底长什么样?
  9. html页面在f5刷新后把所有值清零,页面刷新列表内容不丢失
  10. VS2013好用的插件
  11. 【报错】paddle相关报错和处理方法
  12. Python 之ConfigParser
  13. Hbase下载与安装部署(二)- 使用外部Zookeeper独立部署
  14. NPC问题的证明(可满足性问题、3-CNF可满足性问题、团问题、顶点覆盖问题)
  15. 网页制作初级教程学习资料
  16. 我赢助手详解抖音推荐算法的底层逻辑,视频是怎样从零开始到爆款的?
  17. 有关酸雨,最近淋雨易得皮肤病!!!!!!!!!!!!!!!
  18. C语言编写简单的朗读小工具
  19. ASIC设计中的复位
  20. check root android,Android检查手机是否被root

热门文章

  1. oracle 11g r2 rac +openfiler 2.99 +centos 6.5+vbox
  2. 基于vuex动态添加接口(含axios的封装)
  3. 有关Android Studio的问题Error:Failed to find: com.google.android.gms:play-services:6.1.71
  4. python微信聊天机器人,再也不怕被夸情商高了
  5. 中国静电放电(ESD)抑制器行业发展状况与供需前景预测报告2022-2027
  6. win10共享计算机win7,win10与win7系统电脑通过局域网共享打印机的方法
  7. 微信小程序开发——修改小程序显示名称
  8. 游戏陪玩APP/小程序项目介绍
  9. opencv修改图片尺寸
  10. Windows CMD命令 查看无线密码