作者:Charl

背景

​ 公司需要对平台上各个业务的请求状态码和请求时延等情况进行监控,监控的指标信息主要通过现在比较流行的开源监控平台prometheus实现,prometheus主动对每个业务下所有主机列表提供指标查询接口(通过指定端口和路径)进行拉取和存储。然后grafana展示平台以prometheus作为数据源,将监控数据按需求展示出来。

​ 由于需要接入的业务项目众多,如果通过手动更改prometheus配置文件以及手动为每一个项目创建grafana dashboard势必会耗时耗力,本着运维工作不做重复体力劳动的原则,我利用gitlab的CI/CD功能并结合实际场景写了一些脚本进行项目的自动接入。

​ prometheus监控的项目配置信息通过gitlab进行管理。接入的基本流程是,项目拥有者如果要对某个项目进行接入,只需要增加一个事先约定好格式的iyaml配置文件(非常简单,只需要填写几个k-v值),然后提交merge request。只要master分支有合入,后面的更新prometheus配置文件和添加dashboard都会通过gitlab-ci执行python脚本文件完成。这样就可以大大解放释放自己的劳动力^_^。


基本架构

整个完成项目接入监控的组件由五个部分组成

  • gitlab

用于存储项目的监控配置信息。

  • gitlab-runner

将配置信息git clone下来,然后根据.gitlab-ci.yml内容执行对应的任务。

  • ansible

接受gilt-runner的远程命令,更新各个prometheus节点的监控配置文件并重启。

  • prometheus

运行了prometheus监控进程,根据配置文件读取目标主机的接口抓取监控数据。

  • grafana

以prometheus作为数据源,对监控数据以直观清晰的形式展示出来。


项目接入流程

  1. 以新增配置文件的形式更新gitlab中管理的配置信息,提交Merge request到master节点。
  2. gitlab-runner会在master分支被合入后拉取最新的配置信息,并根据.gitlab-ci.yml内容执行python脚本首先更新prometheus所需要的新的监控配置文件。
  3. 将监控配置文件从gitlab-runner拷贝到ansible节点
  4. gitlab-runner远程调用ansible命令,执行ansible-playbook内容。
  5. ansible-playbook的内容主要是推送新的监控配置文件到所有目标prometheus节点,并完成进程重启使配置生效。
  6. gitlab-runner通过git diff命令识别出新增的项目名称,然后根据grafana dashboard基本模板为每一个新增项目生成特定的json配置文件。
  7. gitlab-runner通过grafana的API接口,将每一个新增项目生成特定的json配置文件作为body体内容发起POST请求,为每个项目创建一个通用的dashboard面板。

Gitlab-runner安装与配置

gitlab-runner的安装与配置可以参考如下链接进行配置,里面还包括了一下gitlab-runner的基本介绍。

GitLab-CI与GitLab-Runner

gitlab-runner通过.gitlab-ci.yml配置的任务来进行具体的操作,关于.gitlab-ci.yml的相关概念和基本配置方法可以根据如下链接进行学习,再次也不再赘述。

持续集成-通过 .gitlab-ci.yml配置任务


文件目录结构

.
├── README.md
├── add_new_project.py
├── configurations
│   ├── project1.yml
│   ├── project2.yml
├── .gitlab-ci.yml
├── grafana_templates
│   ├── dashboard_template.json
│   └── panel_template.json
├── prometheus.yml
├── requirements.txt
├── scripts
│   ├── cd_script.sh
│   └── find_new_yml_config.sh
└── src├── __init__.py├── add_dashboard.py├── gen_prometheus_conf.py├── get_new_project.py

  • .gitlab-ci.yml

定义了gitlab ci的基本任务。

yaml stages: - deploy #定义ansible登陆信息 variables: IP_ADDRESS: <ANSIBLE_IP> PORT: <ANSIBLE_PORT> #定义执行的job内容 project-update-deploy: stage: deploy script: - python add_new_project.py - scp -P $PORT prometheus.yml ansible@$IP_ADDRESS:~/ansible - ./scripts/cd_script.sh $IP_ADDRESS $PORT only: - master #只有在合入master分支才会执行 tags: - prometheus #匹配gitlab-runner的tag

  • add_new_project.py

脚本的入口,完成prometheus配置的更新与新项目grafana dashboard的添加。

  • scripts目录
  • cd_script.sh
    远程执行ansible-playbook命令,使新配置在prometheus节点生效。
  • find_new_yml_config.sh
    找到每次合入前后新增的项目名,用于添加新的grafana dashboard。
  • grafana_templates

存放了grafana的基础dashboard模板和里面每一个pannel的基础模板。

  • src目录

add_new_project.py所需要调用的函数


Prometheus配置更新

监控项目配置信息统一放在configurations目录下,每个文件的基本内容如下:

port: 80
metrics_path: /metrics
ip_list:
- 192.168.1.10
- 192.168.1.11
tags:
- tag1

​ 每个项目在接入是文件名即为项目名称,提供的监控路径metrics_path和端口port以及项目下的主机列表ip_listtags是用来在grafana里的tag添加,主要是便于面板的搜索,非必选项。

​ 生成新的prometheus配置文件的原理很简单。python脚本遍历configurations下的文件列表,然后按prometheus所需要的格式规范来生成监控信息配置文件prometheus.yml

举例:

global:evaluation_interval: 15sscrape_interval: 15s
scrape_configs:
- job_name: project1metrics_path: /metricsstatic_configs:- targets:- 192.168.1.10:80- targets:- 192.168.1.11:80
- job_name: project2metrics_path: /metricsstatic_configs:- targets:- 192.168.2.10:8080


为新项目添加grafana dashboard

​ 为新增项目添加新的grafana dashboard的主要难点在于如何识别出合入后新的项目文件名,这边主要通过find_new_yml_config.sh来完成,其核心是通过git diff命令来查询合入前后的新增文件差异。

list_changed_files() {git diff --name-status "${PREV_HEAD}".."${CURRENT_HEAD}" | grep "${CONFIG_DIR}" | sed -n '/^[^RDM].*.yml$/p' | cut -f 2 | sort --unique
}

其中PREV_HEADCURRENT_HEAD是合入前后git版本的ID标识,这两个变量的值可以通过gitlab CI /CD所定义的环境变量信息获得,分别对应CI_BUILD_BEFORE_SHACI_BUILD_REF,具体含义参考如下链接:

GitLab CI/CD Variables

通过diff进行对比之后,再进行文本上的过滤以及格式化处理后,即可获得新增项目名。

​ 在获得新增项目名只要将grafana_templates下的模板组装起来,将其中的项目名替换成上面查询到项目名后就可以生成每个项目创建新dashboard的请求体内容。grafana中项目名的主要作用有两个:

  1. 作为dashboard的名字
  2. 由于prometheus里面不同的监控指标是通过项目名作为区分的(prometheus里面是job_name),所以在grafana中每个dashboard的panel对监控数据进行查询时也是根据项目名去查询。

​ 最后将基本信息组装成HTTP POST请求,调用grafana的API接口完成实际创建。关于调用grafana API接口创建dashboard可以参考对应的官方文档,链接如下:

Authentication API

Dashboard API


总结

​ 以上就是通过gitlab ci完成项目接入prometheus监控的实现过程,主要逻辑是运行在gitlab-runner上,所采用的逻辑也比较简单清晰,分步骤调用其他组件完成了整个接入流程。

​ 另一方面,Gitlab上真正在进行更改只是configurations目录下的文件内容,所以gitlab上其实只需要管理项目基本配置信息即可,其余的脚本文件、模板文件等都可以抽取出来,在Gitlab runner上通过容器封装起来,这样做可以进一步将配置信息和脚本程序分离开来。


参考文献

  • GitLab-CI与GitLab-Runner
  • 持续集成-通过 .gitlab-ci.yml配置任务
  • GitLab CI/CD Variables
  • Authentication API
  • Dashboard API

panel items 添加指定位置_通过gitlab-ci自动添加prometheus业务监控相关推荐

  1. 构建指定仓库_使用Travis CI自动构建和部署你的GitBook

    本文,博主将会介绍利用Travis CI持续集成服务自动化构建和部署GitBook. 首先介绍一下TravisCI,下文摘自维基百科-Travis CI Travis CI是在软件开发领域中的一个在线 ...

  2. ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解

    本文主要给大家介绍了关于iOS如何给View添加指定位置边框线的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 略微封装了一下,给View添加指定位置的边框线,其中位移枚举 ...

  3. ios 绘制线框_iOS开发 给View添加指定位置的边框线

    略微封装了一下,给View添加指定位置的边框线,其中位移枚举的使用询问了哥们儿,总算搞定: 封装一:直接封装成了一个方法 /// 边框类型(位移枚举) typedef NS_ENUM(NSIntege ...

  4. Windows添加网络位置向导(即我的电脑中添加网络盘符)

    Windows添加网络位置向导(即我的电脑中添加网络盘符) 简介 添加方法 网络位置格式 简介 概括来说,所谓的网络位置,是指一个主机上的一个盘符.比如,将IP地址为192.128.1.1的主机上的一 ...

  5. 指定的网络文件夹目前是以其他用户名和密码进行映射的_使用 GitLab CI 与 Argo CD 进行 GitOps 实践

    在现在的云原生世界里面 GitOps 不断的被提及,这种持续交付的模式越来越受到了大家的青睐,我们前面也有文章详细讲解了 GitOps 的相关概念,在网上也可以找到很多关于它的资源,但是关于 GitO ...

  6. 点击定位到指定位置_以三菱PLC来举例说明相对定位与绝对定位指令

    在自动化生产.加工和控制过程中,经常要对加工工件的尺寸或机械设备移动的距离进行准确定位控制.这种定位控制仅仅要求控制对象按指令进入指定的位置,而,定位又为绝对定位,相对定位两种,那么为什么又分为绝对定 ...

  7. android定位附近店铺,高德地图怎么添加店铺位置_高德地图定位怎么设置添加自己家店铺位置_攻略...

    高德地图是国内最知名的地图导航软件,基本上每个人的手机上都有这款软件.如今想要方便出行都可以通过高得地图查询位置就可以了,给我们的生活带来了很多的便利.在高德地图上也可以很方便的查询各个地方的店铺,通 ...

  8. excel怎么添加换行符_在Excel公式中添加换行符

    excel怎么添加换行符 在Excel公式中添加换行符 (Add Line Break in Excel Formula) It's easy to add a line break when you ...

  9. excel中提取月份_在Excel中自动添加月份表

    excel中提取月份 Set up a Master sheet in your workbook, and add month sheets automatically, based on that ...

  10. GitLab CI 自动部署netcore web api 到Docker

    前端篇文章中,我们已经成功的将asp.net core webapi在Docker容器中运行,并且部署了一套自己的GitLab环境. .Net & Docker(二)5分钟快速用Docker部 ...

最新文章

  1. 慢慢学Linux驱动开发,第十章,GNU C的扩展
  2. 《Pro SQL Server Internals》部分翻译(P155-165)
  3. 开发者需要了解的WebKit
  4. 阅读redis源代码的一些体会
  5. net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比
  6. 【Unity开源项目精选】xLua:Unity热更新首选
  7. 自定义加载等待框(MBProgressHUD)
  8. 入行AI,从何做起—光环飞马网直播课回顾
  9. Python Imaging Library: PSDraw Module(Postscript打印机模块)
  10. 静态代理,动态代理,Cglib代理详解
  11. jt808server .java_jt808-server
  12. signature=9b2caa13f2468eba05d2d57d9a88606d,【音响聚焦】顶级Hi-End音响发烧器材介绍(功放篇)...
  13. 文言文编程背后-语言的本质
  14. 小数据 vs. 大数据
  15. android分辨率2k3k4k,android 不同分辨率适配
  16. AutoMapper 9.0的使用
  17. 物联网卡能否长期使用 有没有限制
  18. 【Vue3.0】Vue3.0简介-指令-过滤器-案例D2.0
  19. Pikachu靶场通关笔记--Sql Inject(SQL注入)
  20. 数据可视化——用Excel巧妙绘制图表及在论文中的排版技巧

热门文章

  1. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析...
  2. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第2节 TCP协议_1_TCP通信的概述(上)...
  3. 王者荣耀交流协会Beta发布文案美工展示博客
  4. 根据输入时间判断年龄是否在18~68周岁之间
  5. 87-Moving average of oscillator,移动平均振荡指标.(2015.7.4)
  6. maven 添加支持编译jdk1.7
  7. Codeforces Round #588 (Div. 1)
  8. C++学习总结(1)
  9. 打包,VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
  10. Remove Untagged Images From Docker