[TOC]html
你们好, 学点xx 系列也推出一段时间了。虽然 yann 能力有限,但仍是收到了不少鼓励与赞扬。对这个系列 yann 仍是很喜欢的,特别是 Prometheus 篇,在期间经历公众号 100 篇文章记念,和一次较大的改版。真的是很难忘的一个篇章,下面带领你们回顾下。前端
在以前的分享中 yann 说须要准备个配置文件,而后使用 docker 就能够把 Prometheus 启动起来了,其实这是不完整的。起来的只是服务端,他还须要客户端,或者说还须要帮它提供 metrics 的各类模块。 node
让咱们依次来完成这个事情,首先完成一个 prometheus 的yml配置文件。这里, yann 从官网拿了一个实例的配置文件,虽然内容不少,但没有作任何修改。一样,你也能够直接用这个文件让它跑起来,后面咱们会有个篇章来分析配置文件的详细内容。mysql
global:scrape_interval: 15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager).external_labels: monitor: 'codelab-monitor'# A scrape configuration containing exactly one endpoint to scrape:# Here it's Prometheus itself.scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: 'prometheus' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s static_configs: - targets: ['localhost:9090']
准备好配置文件之后,你能够用 docker 命令,挂载上这个配置文件,把 Prometheus 启动起来。linux
请注意一下配置文件的位置,yann 写的是本身服务器的文件路径,你须要改为本身的。git
若是没有报错的话,服务端就起起来了,请用端口查看命令确认一下相应的端口有没有起来。注意,不要使用 docker ps 来查看。缘由 yann 后面会说。github
docker run -d \ --net=host \ -v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
用一样的方法把客户端 node-exporter 也启动起来,确认9090和9100端口是存在的。web
docker run -d \ --net="host" \ --pid="host" \ -v "/:/host:ro,rslave" \quay.io/prometheus/node-exporter \ --path.rootfs=/host
以上两组命令都来自官网的文档。正则表达式
若是一切正常的话,咱们能够来查看到下面的效果,截图的IP地址是yann 服务器上面的,你能够换上本身的来试一下。sql
网址 http://10.10.13.15:9090/graph
输入 IP 地址:9090 端口默认会到达这个网址。这个界面能够选择相关项目进行一些查询操做,也能够选择查询的项目的时间范围。
部署好Node Exporte 后能够看到。
另外,http://10.10.13.15:9100/metrics 也能够看到相同的输出。
网址 http://10.10.13.15:9090/targets
这个页面能够看到如今监控的目标。如图,yann 如今监控了两个项目:一个是自身的 9090,一个是客户端 9100,状态都是正常的。
在这个配置中 yann 遇到了两个坑,如今也给你们分享出来,避免其余人也陷入进来。
端口消失
第一个坑准确来讲也不算是坑,是 docker 的一个参数,只不过 yann 不是常常用。
--net=host
当配置了这个参数时, 表示直接打通容器网络与本地网络。相对的 docker ps 上看不到容器的端口,必定要用端口查看命令看才能看获得。
描述可能比较抽象,yann 放了一个截图。能够看到查看状态的时候彻底看不到容器的端口。
端口冲突
另一个坑和上一条问题相关,由于在 docker ps 命令下没有过滤到端口。因此 yann 认为并无端口冲突。实际上它和 yann 前些天部署的 elasticsearch-head 是冲突的,你们都是9100。若是有近期内搞过 ES 的同窗要特别注意这一点。
433cab2b4724 mobz/elasticsearch-head:5 "/bin/sh -c 'grunt s…" 11 days ago Created 9100/tcp
当时 elasticsearch-head 因故又使用了安装包部署,此次的容器用了 --net=host 的网络设定,结果就在宿主机里杠上了。
grafana 的部署相对简单
docker run -d --name=grafana -p 3000:3000 grafana/grafana
一行命令搞定, 确认3000 端口存在之后,在浏览器上访问就好。
例如:http://10.10.13.15:3000/
若是问 grafana 难不难?大多数人都会感受挺简单的:「不就是个可视化工具么,数据都有了,还怕表出不来?」。
其实还真有点难度, 主要缘由就是找不到设置的地方;外加语言障碍(目前 yann 手里尚未中文版,有的筒子千万给我留言)。咱们来一步一步看。
相比起来, 数据源仍是比较好设置的, 若是是新部署向导程序还存在的话, 直接会引导过去。
若是是中途接手他人的项目的情况,也不用担忧。yann 保证只拿到账号密码,没人指导的状况下, 你也是能够把数据源配置出来的。
不过要注意下 Whitelisted Cookies , 这个框之前版本是没有的,yann 先填了个 none 跳过。
接下来是 dashboard,改配置仪表盘了。
很直观,而后
(此处感谢小熊)
「是选 Visualization (可视化) 对吧, 我已经看到图表的标志了。接着选择 Graph , 图表我来了」。
^^ 是否是有点无从下手。
各位不要笑, yann 最先也是坑在这里的。
娱乐节目结束, 如今开始设置一个图表出来。
其实正确设置的位置是在上边一个按钮那里。
Metrics 栏目随便选择一个就能够了。
结果演示
还有另外两个按钮,是一些设置和告警, 本身看一下就行了。
最后, 设置须要保存一下,保存按钮在这里。
补充一下。设置完成后, 后期想调整 dashboard 也是在这里。找不到设置按钮,顺着左上角 田字白方块 点来点去的大有人在,笑。
闲话就此打住,先来操做。昨天的时候,咱们曾经在 grafana 上弄出图表了。那么今天的任务。是产生不少的图表来应付mysql的平常须要。
怎么样产生大量的图表呢?一个一个设定固然是很累的,因而咱们就想到了模板,先去官方的网站上先下套模板回来。
就你了。
导入模板,配置数据源。很顺利的图表就出来了,唉,好像少点什么,先无论他。
?为何个人图表一直都是异常状态呢?设置数据源的时候,数据库链接测试也经过了,难道是权限不足让咱们看看日志。
果真是权限不足,让咱们加权限,还不行?我再加,我用root访问总能够了吧,什么,竟然还不行。
撞墙以后开始反思。日志给出的信息比较有限,没有权限访问,不必定是帐号没权限,先看看有没有这个库,果真没有?再分析一下搜索语句,终于发现了。原来这个模板是比较特殊的一个,它须要导入一个数据库进去。尝试操做了一下。终于不报异常了。
# 下载 https://github.com/john1337/my2Collectormysql --user=root -p < my2.sql# 赋权 CREATE USER 'grafanaReader' IDENTIFIED BY 'Abcd1234'; GRANT SELECT ON my2.* TO 'grafanaReader'@'172.17.%.%' IDENTIFIED BY 'Abcd1234';
这是我很早之前部署 prometheus 时候犯的一个错误。当时也没有那么意识到 exporter 的做用。找到一个包,下载下来就开始使用。
这个模板虽然和日常的不太同样,但并非彻底没有用处。若是有些环境,不是那么方便安装插件,反而允许导入表的话,是可使用这种方法的。
如今,咱们来使用比较常规一些的方法部署 Mysql的图表。
更新用户权限:
GRANT SELECT ON performance_schema.* TO 'yann'@'%' IDENTIFIED BY 'Abcd1234';
mysqld-exporter 部署:
# docker network create my-mysql-networkdocker run -d \ --net="host" \-e DATA_SOURCE_NAME="yann:Abcd1234@(10.10.13.15:3306)/" \prom/mysqld-exporter
注意:
mysql 数据库通常有单独的容器网络。yann 以前选择了与宿主机互通, 如今也不方便改回来了。本身部署的话, 注意注释掉的语句,固然docker 命令也须要调整。
prometheus.yml 也调整一下, 这里先给出调整内容。总体配置后面会说明。
- job_name: linux_mysql static_configs: - targets: ['10.10.13.15:9104'] labels: instance: yanns_mysql
添加了一个 job,修改后从新部署 prometheus 容器。
再次访问 targets 网页,已经有新内容出现了。
http://10.10.13.15:9090/targets
使用 mysqld-exporter 以后, 开启的数据源就是 prometheus 了。这一点请切记,不少同窗由于是 Mysql 的监控, 就直接去添加了 Mysql 的数据源,而后奇怪为何一直没有输出。
另外,图表的模板,也使用导入的方式,文件在这里:
git clone https://github.com/percona/grafana-dashboards.git # 仓库 ls grafana-dashboards/dashboards
最后, 再奉送一个我司在正使用的 PMM 的部署说明。
Percona监控和管理(PMM)是一个用于管理和监控MySQL和MongoDB性能的开源平台,其余详细介绍请自行百度。
部署:
docker run -d \ -p 8089:80 \ -v pmm-data \ --name pmm-server \ --restart always \ percona/pmm-server
除了监控平台之外, 数据库服务器上还要安装 Client 并配置。固然,这不是今天的主题因此略过。
系统的 Agent 其实以前就部署好了。前两天 Prometheus 配置时候 启用的两个端口 9090 和 9100 ,其中9100 就是系统 Agent的端口,另外 提一下 9104 是Mysql的。
这里简单介绍一下配置文件:
# 全局global: # 默认抓取周期scrape_interval: 5s # 规则的默认周期,好比持续30秒则匹配evaluation_interval: 30s # 规则文件,先不涉及# rule_files:# 抓取配置scrape_configs: - job_name: "node" static_configs: - targets: - "localhost:9100"# Alertmanager 告警相关配置alerting:alertmanagers: - scheme: https static_configs: - targets: - "localhost:9093"
这是一个比较精简的配置文件,能够参考一下。另外注意,配置文件是 yaml 格式,须要注意对齐。
咱们添加一下操做系统的监控配置。
- job_name: linux01 static_configs: - targets: ['10.10.13.15:9100'] labels: instance: yanns_linux
job 和 instance 的区别是,一个job 能够包含多个不一样 IP 不一样端口下的进程。
添加完成
如今咱们来演示一些数据的查询 :
文件系统可用字节数:
node_filesystem_avail_bytes
效果如图:
显示了各个分区的可能空间, 固然纯数字是比较难以阅读的, 能够加上一些处理
经常使用的一些性能指标:
下面是一些经常使用的查询语句, 你们能够本身试一下:
# cpu100 - (avg by (instance) (irate(node_cpu_seconds_total{job="linux01",mode="idle"}[5m])) * 100)# memnode_memory_MemFree_bytes{job='linux01'}# diskrate(node_disk_read_time_seconds_total{job='linux01', device='sda' }[5m]) * 512# networkrate(node_network_receive_bytes_total{job='linux', device!='lo'}[5m])
注意:exporter 对应字段的名字,根据版本不一样会有所改变,若是查询没有结果,请自行调整。
告警的配置略为繁琐, 咱们从头开始梳理。
更新prometheus.yml
# 增长alerting:alertmanagers:- static_configs: - targets: - 10.10.13.15:9093rule_files:- '/etc/prometheus/alert.rules'
映射 alert.rules 文件
docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \--name prometheus-server6 prom/prometheus
alert.rules 的内容
groups:- name: examplerules: # Alert for any instance that is unreachable for >5 minutes.- alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.groups:
global: resolve_timeout: 5mroute: receiver: 'default-receiver' group_wait: 30s group_interval: 1m repeat_interval: 1m group_by: ['alertname'] routes: - match: severity: critical receiver: email-mereceivers:- name: email-meemail_configs:- to: GMAIL_ACCOUNT from: GMAIL_ACCOUNT smarthost: smtp.gmail.com:587 html: '{{ template "email.default.html" . }}' auth_username: "GMAIL_ACCOUNT" auth_identity: "GMAIL_ACCOUNT" auth_password: "GMAIL_AUTH_TOKEN" - name: 'default-receiver' webhook_configs: - url: http://webhook-dingtalk/dingtalk/send/ send_resolved: true
部署Alertmanager
docker run -d --net="host" -v /home/data/prom/config.yml:/etc/alertmanager/config.yml --name alertmanager prom/alertmanager
简单说明一下, alert.rules 负责定义 哪一种状况触发报警。而 Alertmanager 定义检查报警的状况以及告警媒介,例如邮件,钉钉等。
如下是一些配置截图展现:
更新配置后, 规则已经显示出来了
alertmanager 的页面,内容偏重组件自身的状态
访问 http://10.10.13.15:9093/#/alerts
关掉 mysqld_exporter 后产生的告警
部署
监控 Docker 须要 Prometheus、cAdvisor 和 Grafana。另外两个以前已经部署过, 咱们来看一下 cAdvisor。
cAdvisor 能够对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用状况、内存使用状况、网络吞吐量及文件系统使用状况。
部署
这个软件属于开箱即用类型, 部署方便,如下为官方示例。
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ --privileged=true \google/cadvisor:latest
已经部署完毕
配置
Prometheus 的配置文件也须要更新一下,给 prometheus.yml 追加 job:
- job_name: cadvisor static_configs: - targets: ['10.10.13.15:8081'] labels: instance: yanns_docker
再次启动 Prometheus :
docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \--name prometheus-server7 prom/prometheus
效果
添加完成,cadvisor 的管理界面以下,一只可爱的猫头鹰。
可爱的猫头鹰召唤出来了,让咱们再来配置一下相关的图表。第一步仍是添加数据源,这个操做咱们应该已经轻车熟路。
数据源
提供一张图片供你们参考,具体操做就省略了。
导入模版
数据源配置置好后,再来导入模板,在 Grafana 中有一个很是简单的方式,就是把模板的序号输进去就能够进行导入。如图,本次须要用到的模板是193号。
最后就是监控效果了。如图,配置好模板就会出现本机全部 Docker 的相关信息,请你们自行尝试。
咱们先来介绍下这个软件 ,Etcd 是CoreOS开发的一个分布式一致性键值存储系统。做为 Kubernetes 的默认数据库为人熟知。
由于 yann 的环境之前部署过k8s,因此已经有etcd组件了,此次咱们不从头开始部署 Etcd ,只是简单演示一下 Etcd 的使用。
Etcd 比较特殊的部分就是常常须要带着版本标识和证书来执行命令。不然的话会报错或有至关的功能限制。详情请看下面的命令举例。
ETCDCTL_API=3 /opt/k8s/bin/etcdctl \ --endpoints=https://10.10.13.15:2379 \ --cacert=/etc/kubernetes/cert/ca.pem \ --cert=/etc/etcd/cert/etcd.pem \ --key=/etc/etcd/cert/etcd-key.pem endpoint health
添加 Job
在了解基本的状况之后,让咱们来监控etcd。首先,在 Prometheus 的配置文件上新加一个 job 任务。注意,此次与往常不一样,Ca 证书和 Etcd 自身的证书也写入了配置文件之中。
prometheus.yml 追加部分:
- job_name: 'etcd' scheme: 'https' tls_config: cert_file: '/etc/ssl/etcd.pem' key_file: '/etc/ssl/etcd-key.pem' ca_file: '/etc/ssl/ca.pem' static_configs: - targets: ['10.10.13.15:2379']
既然配置中有相关内容,天然也须要提供文件。咱们从新撰写了启动命令,把三个证书文件挂载到了容器里面,以下:
docker run -d --net=host \-v /home/data/prom/prometheus.yml:/etc/prometheus/prometheus.yml \-v /home/data/prom/alert.rules:/etc/prometheus/alert.rules \-v /etc/etcd/cert/etcd.pem:/etc/ssl/etcd.pem \-v /etc/etcd/cert/etcd-key.pem:/etc/ssl/etcd-key.pem \-v /etc/kubernetes/cert/ca.pem:/etc/ssl/ca.pem \--name prometheus-server8 prom/prometheus
Docker 的启动命令是愈来愈长了。把证书挂到容器里面,确实不是一个很合理的操做。不过咱们如今仅仅做为演示,并不做为实际的解决方案。同时,prometheus 有对应开发 Kubernetes 专用的版本 kube-prometheus。里面有完善的相关解决方案,后面有机会能够给你们分享。
挂载好文件后,启动 Docker,同时打开普罗米修斯的控制页面,就看到了新的 Target 挂载成功了。
以后一样是导入模板,此次的模板号是3070,下面两幅截图是Etcd监控的截图,供你们参考。
在前面的介绍中, yann 有意回避了一些复杂的问题。好比说每次下载的模板不可能完美匹配,咱们须要一些本身定制的图表;或者模板太多了,咱们须要精减一些项目;要么干脆须要特定的图表只给特定的人看。林林总总, 现实中都会遇到的, 今天来梳理一下。
Orgs 是一个比较神奇的功能。不一样组织之间, 数据源独立, 仪表版也独立,甚至彼此之间不能共享。比较推荐的方法是创建多个组织,按部门或业务线来划分,而后组合起来赋权给用户。
纯语言描述比较抽象, 咱们来演示一下,这是该功能的位置。
创建一个组织,yann fans 俱乐部 (害羞)
检查数据源和仪表板
不一样的组织,数据源也不同。如图,Grafana 中以前设定好的数据源所有消失了,一样仪表版也没了,说明组织是隔离性比较强的。这个分隔方式有点相似 Docker 。
api
既然提到组织,咱们再了解一下相关的赋权功能 API。这个功能有点像阿里云上的 AccessKey,持 Key 的人能够作权限内的操做,好比说浏览、修改甚至管理整个 Ggrafana。这个API的具体用法,请看下面截图演示。
演示一下
生成的 API key
除了 key 以外, 截图里面,靠下部分举例的就是操做方式,下面还会有相关讨论。
除了 Orgs “组织”,Grafana 还有另外一个很特点的功能:模板变量。
说到这里,让咱们来思考一个问题:一组应用或多台服务器之间,监控项目的区别到底在哪里呢?
答案是 IP、端口、应用的名称或标签不同。根据这个特色,咱们能够把这些不同的部分作成变量,而后就可使用一套模板对应一组同类型应用及服务器的监控。
变量举例:
变量的制做方法以下:须要提供变量名称、获取类型、标签及是是否隐藏。而后在查询框 Query Options ,选择数据源并填写查询语句。经过查询的方式从数据源里取出一系列值,有必要的话,还能够用正则表达式来进一步得到准确的输出。
这样作出来的变量,就能够在仪表板上使用了。须要注意的是 Grafana 是一个前端项目,变量操做须要创建在已有数据的基础上,若是数据源 Prometheus 里面没有相关数据相匹配的记录,生成再多变量也是迫不得已的。
最后,咱们来了解一下 Json 的数据结构。如图所示,图表及仪表板均可以导出为 Json 格式。也就是说咱们以前玩的不亦乐乎的导入功能,其实就是厂家或第三方作好并导出来的仪表板的 Json格式。
对比导出的 Json 文件,就会发现大部份内容都是相同的,替换 认证字段、data和仪表板名称就能够生成对应组织的仪表板。
基于这个特色,我同事有了一个想法:“说咱们去写一些前端页面,而后让其余部门同事使用不一样 API 发起 POST 的请求,而后再把拼接好的命令及 Json 文本打进去,是否就能够作成自定义提交,按我的需求自助生成图表呢?这样运维同事就解放了。
而后把这个需求和前端同事一说,人家说「你 Grafana 就是个前端项目,你用另写一套前端去修改一个前端的提交文件,不以为很二么? 」 ,无言以对。
以上为自产小段子,没必要当真。这个话题涉及到了HTTP网页的 POST 提交过程,有兴趣的同窗能够尝试一下。不必定要写代码,使用一些测试工具,好比 POSTMAN 也能够作到相似的效果,这里就不给出事例了。
今天是总集篇,只是把以前笔记回顾一下。竟然有这么多细节,再一次感慨,分享东西出来,对本身提高真的挺大的。
<center>这最近不方便?</center>
<center>那还能够分享咱们的文章嘛~~</center>
<center><font color=Red face="黑体">网站其余文章</font></center>
<font color=OrangeRed face="黑体">深度科普</font> (CNCF→) 毕业项目 | 生态 | Ansible | Chef | Puppet | VMware | OpenStack | registry | Harbor| Docker | Containerd | RKT | ROOK | Calico | Flannel | Open vSwitch | Kubernetes | Zookeeper | Consul | Etcd | GRPC | thrift | MySQL | Spark | Storm | RocketMQ | kafka| RabbitMQ | Helm | Docker Composer | Packer | Jenkins | Bamboo | (Prometheus→) 构建 | DBA | 系统 | Grafana | Zabbix | Fluentd | ElasticSearch | Logstash | Jaeger | <font color=OrangeRed face="黑体">Go语言</font> (go web)网站 | Request | Response| 模板| 数据存储 | 处理 JSON (go docker)冒烟| 限制资源| <font color=OrangeRed face="黑体">Python</font> 期末总结 | <font color=OrangeRed face="黑体">ELK</font> 任务 | 部署ES | 最小模式 | 集群 | Logstash | 中转 | 输出 | kafka | 消息定制 | 过滤 | geoip | grok | kibana | es head | 使用 | CURD | 指引 <font color=OrangeRed face="黑体">Redis</font> 集群 | 脚本 |迁移 | 加固 | 持久化 | 性能 | 缓存思考 | <font color=OrangeRed face="黑体">Kafka</font> 集群 | 故障排查 | 命令行 | 术语 | 集群原理 | <font color=OrangeRed face="黑体">近期文章</font> 寂寞的时候, Siri在帮我数羊 - 100期记念
本文由博客一文多发平台 OpenWrite 发布!
发布在平台的文章, 和原文存在格式差别, 阅读不便请见谅
最新内容欢迎关注公众号:
![]()