
1、Prometheus官网提供的mysql exporter 对于mysql实例只能一个进程监控一个实例,数据库实例很多的情况,不方便管理
2、内部有定制化监控需求,RDS 默认无法实现,比如对数据库增长的监控
3、默认 Prometheus官网提供的mysql exporter 采集mysql几乎所有的指标,但是实际用到的却不多。浪费存储空间
先了解对于数据库的监控需求
1、一个exporter可以采集所有RDS实例数据
2、RDS 实例采集指标不用全部采集,按需即可
3、定制化需求
** 针对第一个需求 **
之前在使用Prometheus监控redis的时候,有个export实现了可以同时监控多个实例的情况,大概的思路是:
把实例名称或者地址作为target参数传递给一个URL,这个URL就是一个exporter,然后根据传递的不同target 采集相同指标
** 针对第二个需求 **
做过监控的人都知道mysql的监控指标其实都是采集的show global status 和 show global variables 的结果然后做相关汇总或者计算
所以我们很容易就可以通过这两个sql的结果帅选出需要的选项保存在一个配置文件,采集的时候读取该配置文件选项,按需采集即可
** 针对第三个需求 **
数据库磁盘使用率 / 统计数据库、表的总大小 都不是从status/variables 能获取到的。所以了解Prometheus架构的就知道,可以使用 pushgateway 来实现
cws-mysql-exporter
├── aliyunapi.py
├── config.py
├── generate-instance-yml.py
├── instance.yml
├── metrics.yml
├── utils.py
├── pushgateway.py
├── push_cron_dbsize.py
├── push_cron_rds_cpumemiops.py
└── rds-exporter.py
aliyunapi.py 是封装的阿里云相关的api接口,因为磁盘和CPU只能从阿里云获取,它和主机有关系config.py 里面定义 阿里云api的ak/sk ,以及 exporter连接数据库用到的账号和密码,这个账号密码是所有实例共用的generate-instance-yml.py 这个是首次需要执行的脚本,生成 instance.yml 配置文件,主要是获取所有RDS的实例名称和连接地址,及instance_id(因为有些接口入参必须是instance_id)rds-xxxx:
host: rm-xxxxxx.mysql.rds.aliyuncs.com
id: rm-xxxxxx
rds-yyyyy:
host: rm-yyyyy.mysql.rds.aliyuncs.com
id: rm-yyyyy
metrics.yml 是需要采集的监控指标,分variables 和 status ,格式如下variables:
max_connections: ""
max_user_connections: ""
... ...
status:
Aborted_connects: ""
Aborted_clients: ""
... ...
utils.py 是封装的公共函数
pushgateway.py 是封装的需要推送的 pushgateway 的监控指标
push_cron_dbsize.py 和 push_cron_rds_cpumemiops.py 是包装的不同维度需要推送到 pushgateway 的脚本, 最终需要在crontab中定时去执行
rds-exporter.py 是 exporter 的入口,这里借助了 flask 来运行server
exporter 开源地址详见: 自定义exporter实现多RDS数据采集
启动 rds-exporter, 默认端口在 5005
这里介绍简单的安装和配置,具体的Prometheus及其架构介绍网上有很多资料,大家自行查阅即可
1、安装Prometheus
#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自动化安装 Prometheus
#
version="2.36.1"
if [ $# -eq 1 ]
then
version="$1"
fi
echo "Will install prometheus ${version} version"
# download
wget "https://github.com/prometheus/prometheus/releases/download/v${version}/prometheus-${version}.linux-amd64.tar.gz"
# untar and set link
tar -zxf prometheus-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/prometheus-${version}.linux-amd64 /opt/app/prometheus
2、安装pushgateway
#!/usr/bin/env bash
# encoding: utf-8
# Author: Eagle
# Desc: 自动化安装 Prometheus Pushgateway
#
version="1.4.3"
if [ $# -eq 1 ]
then
version="$1"
fi
echo "Will install prometheus pushgatewa ${version} version"
wget "https://github.com/prometheus/pushgateway/releases/download/v${version}/pushgateway-${version}.linux-amd64.tar.gz"
# untar and set link
tar -zxf pushgateway-${version}.linux-amd64.tar.gz -C /opt/app
ln -s /opt/app/pushgateway-${version}.linux-amd64 /opt/app/pushgateway
3、启动 pushgateway
配置systemd service,文件位置/usr/lib/systemd/system/pushgateway.service
Description=Prometheus Pushgateway Service
Requires=network-online.target
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/opt/app/pushgateway/bin/pushgateway
[Install]
WantedBy=multi-user.target
pushgateway不需要额外的配置,默认是在9091端口
4、配置Prometheus并启动
配置systemd service,文件位置/usr/lib/systemd/system/prometheus.service
Description=Prometheus Server
Requires=network-online.target
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/opt/app/prometheus/bin/prometheus --config.file=/opt/app/prometheus/prometheus.yml --storage.tsdb.retention=60d --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.path=/data/prometheus-data
[Install]
WantedBy=multi-user.target
注意提前创建 prometheus 数据目录
配置Prometheus
# 这里是全局变量的配置
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# 这里是配置 alertmanager, Prometheus会根据 rules 规则把告警信息发送给 alertmanager 组件,alertmanager 负责实际告警信息的发送
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.xx.yyy:9093']
# 这里是配置告警规则,本次不是讲解重点先忽略
# rule_files:
# - "rules/rds_rules.yml"
# 配置Prometheus从那些 endpoint 或者叫 exporter 采集监控数据
scrape_configs:
# 默认监控 Prometheus服务本身
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
labels:
instance: prometheus
# 自定义的mysql targets ,这里的targets是通过直接配置的方式
# 另外还有通过文件的方式、通过consul等自动发现的方式,
# 这两种方式这里不展开介绍,感兴趣的关注后续文章
- job_name: 'mysql_targets'
scrape_interval: 60s
scrape_timeout: 12s
metrics_path: /scrape
static_configs:
- targets:
- rds-xxx
- rds-yyy
# relabel_configs 是通过label重写实现我们最终需要的标签
# 另外这里是通过重写target,重新定义了 endpoint 地址
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.3.108:5005
# pushgateway
- job_name: 'pushgateway'
scrape_interval: 60s
static_configs:
- targets:
- 192.168.3.108:9091
# 这里是对自定义的 mysql-exporter 做监控
- job_name: 'rds-exporter'
scrape_interval: 60s
static_configs:
- targets:
- 192.168.3.108:5005
重启Prometheus或者执行reload操作 curl -XPUT http://192.168.3.108:9090/-/reload 使配置生效
最终在prometheus的webui界面的Status -> Targets 里面看到如下

具体的Grafana安装和配置请参考教程 或者网上自动查阅
打开Grafana界面进行 Dashboard的导入,如下图所示

点击左侧 + 选择 import ,然后通过三种不同的方式导入Dashboard模板
1、在granfan 官网找到合适的模板之后,记住ID,输入该ID然后点击Load
2、通过右上角的 Upload .json file 上传本地的模板json文件
3、直接把本地的模板json文件内容copy到 Or paste JSON 下方的框中即可
这里提供自定义的模板JSON文件 下载地址
最终的效果如下

我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是