prometheus简介
Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合.由SoundCloud公司开发。Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker 。Prometheus应该是为数不多的适合Docker、Mesos、Kubernetes环境的监控系统之一。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus。
与其他监控系统相比,Prometheus的主要特点是:
- 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸)。
- 非常高效的存储,平均一个采样数据占~3.5bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
- 一种灵活的查询语言。
- 不依赖分布式存储,单个服务器节点。
- 时间集合通过HTTP上的PULL模型进行。
- 通过中间网关支持推送时间。
- 通过服务发现或静态配置发现目标。
- 多种模式的图形和仪表板支持。
prometheus的架构
它的服务过程是这样的Prometheus daemon负责定时去目标上抓取metrics(指标) 数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。
Prometheus系统的主要由以下三部分:prometheus、alertmanager、*_exporter(多个)
Prometheus
prometheus是最主要的组件,支持通过配置文件、文本文件、zookeeper、Consul、DNS SRV lookup等方式指定抓取目标。支持很多方式的图表可视化,例如十分精美的Grafana,自带的Promdash,以及自身提供的模版引擎等等,还提供HTTP API的查询方式,自定义所需要的输出。负责采集数据,将告警发送到alertmanager,alertmanager再将告警以各种形式送出
Alertmanager
是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。
*_exporter
exporter是一组程序,它们分别被用来采集物理机、中间件的信息。有prometheus官方实现的,还有更多第三方实现的:
这些exporter分别采集对应系统的指标,并将其以prometheus的格式呈现出来,供prometheus采集
prometheus配置安装
下载安装
到https://prometheus.io/download/去下载一份,然后如下执行
tar xvfz prometheus-*.tar.gz
cd prometheus-*
进入目录后可以通过下面命令来查看帮助
./prometheus --help
配置
打开prometheus.yml配置文件进行相关配置,在这里我们主要对我们的canal worker进程进行监控
- job_name: 'canal'
static_configs:
- targets: ['localhost:11112'] //端口配置即为canal.properties中的canal.metrics.pull.port
配置完毕后可以执行 如下命令进行启动,这个配置文件的路径也可以指定
./prometheus --config.file=prometheus.yml
之后通过打开 http://localhost:9090/graph来查看监控情况,这个是prometheus自带的监控界面比较简陋,我们可以通过grafana来进行监控
Grafana配置安装
Grafana是一个开源的度量分析与可视化套件。经常被用作基础设施的时间序列数据和应用程序分析的可视化,Grafana支持许多不同的数据源。每个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。 官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB
下载安装
进入https://grafana.com/grafana/download页面进行下载,然后按照下面步骤进行配置granfa http://docs.grafana.org/features/datasources/prometheus/#adding-the-data-source-to-grafana,使prometheus的监控信息通过grafana来展示
canal监控配置(摘自github的canal主页readme)
canal监控安装步骤
- 安装并部署对应平台的prometheus,参见官方guide
- 配置prometheus.yml,执行./promtool check config prometheus.yml命令,查看配置文件是否有错,添加canal的job,示例:
- job_name: 'canal'
static_configs:
- targets: ['localhost:11112'] //端口配置即为canal.properties中的canal.metrics.pull.port
- 启动prometheus与canal server
- 安装与部署grafana,推荐使用新版本(5.2)。
- 启动grafana-server,使用用户admin与密码admin登录localhost:3000 (默认配置下)。启动:./grafana-server start
- 配置prometheus datasource.
- 导入模板(canal/conf/metrics/Canal_instances_tmpl.json),参考这里。、
- 进入dashboard 'Canal instances', 在'datasource'下拉框中选择刚才配置的prometheus datasource, 然后'destination'下拉框中就可以切换instance了(如果没出现instances列表就刷新
canal监控相关原始指标列表
指标 | 说明 | 单位 | 精度 |
canal_instance_transactions | instance接收transactions计数 | - | - |
canal_instance | instance基本信息 | - | - |
canal_instance_subscriptions | instance订阅数量 | - | - |
canal_instance_publish_blocking_time | instance dump线程提交到异步解析队列过程中的阻塞时间(仅parallel解析模式) | ms | ns |
canal_instance_received_binlog_bytes | instance接收binlog字节数 | byte | - |
canal_instance_parser_mode | instance解析模式(是否开启parallel解析) | - | - |
canal_instance_client_packets | instance client请求次数的计数 | - | - |
canal_instance_client_bytes | 向instance client发送数据包字节计数 | byte | - |
canal_instance_client_empty_batches | 向instance client发送get接口的空结果计数 | - | - |
canal_instance_client_request_error | instance client请求失败计数 | - | - |
canal_instance_client_request_latency | instance client请求的响应时间概况 | - | - |
canal_instance_sink_blocking_time | instance sink线程put数据至store的阻塞时间 | ms | ns |
canal_instance_store_produce_seq | instance store接收到的events sequence number | - | - |
canal_instance_store_consume_seq | instance store成功消费的events sequence number | - | - |
canal_instance_store | instance store基本信息 | - | - |
canal_instance_store_produce_mem | instance store接收到的所有events占用内存总量 | byte | - |
canal_instance_store_consume_mem | instance store成功消费的所有events占用内存总量 | byte | - |
canal_instance_put_rows | store put操作完成的table rows | - | - |
canal_instance_get_rows | client get请求返回的table rows | - | - |
canal_instance_ack_rows | client ack操作释放的table rows | - | - |
canal_instance_traffic_delay | server与MySQL master的延时 | ms | ms |
canal_instance_put_delay | store put操作events的延时 | ms | ms |
canal_instance_get_delay | client get请求返回events的延时 | ms | ms |
canal_instance_ack_delay | client ack操作释放events的延时 | ms | ms |
监控展示指标
指标 | 简述 | 多指标 |
Canal instance 基本信息。 | 是 | |
网络带宽。包含inbound(canal server读取binlog的网络带宽)和outbound(canal server返回给canal client的网络带宽) | 是 | |
Canal server与master延时;store 的put, get, ack操作对应的延时。 | 是 | |
sink线程blocking占比;dump线程blocking占比(仅parallel mode)。 | 是 | |
Canal instance 处理binlog的TPS,以MySQL transaction为单位计算。 | 否 | |
分别对应store的put, get, ack操作针对数据表变更行的TPS | 是 | |
Canal client请求server的请求数统计,结果按请求类型分类(比如get/ack/sub/rollback等)。 | 否 | |
Canal client请求server的响应时间统计。 | 否 | |
Canal client请求server返回空结果的统计。 | 是 | |
Canal instance ringbuffer中堆积的events数量。 | 否 | |
Canal instance ringbuffer中堆积的events内存使用量。 | 否 | |
client发送请求的QPS,按GET与CLIENTACK分类统计 | 是 |