prometheus+grafana+alertmanger - 监控方案

监控方案涉及的关键问题
  • 采集数据
  • 存储数据
  • 告警、展示数据

那么基于prometheus的监控方案是用什么技术实现?本文基于docker进行部署,目的以简单的demo快速了解prometheus监控方案的涉及的知识点以及流程。

本文介绍的内容
  • prometheus整体架构介绍
  • 安装prometheus
  • 安装grafana
  • 安装alertmanager
  • grafana关联prometheus
  • prometheus关联alertmanager
  • prometheus定义告警规则
  • alertmanager触发告警
prometheus整体架构


从prometheus官方给的架构图分析出,基于prometheus的监控方案常用组件:

  • Exporters :暴露metrics,收集监控指标,并以一种规定的数据格式提供给Prometheus-采集监控对象数据
  • Prometheus Server :收集数据和存储数据到时间序列数据库中,收集的数据由Exporters提供-采集/存储数据
  • Alertmanager :告警管理,接收Prometheus的告警,去重/分组/发出告警(邮件、webhook等)- 告警
  • Grafana:监控Dashbord,UI展示,设置Prometheus Server地址即可自定义监控Dashbord- UI展示
  • Push Gateway: 用于短期的jobs,jobs直接向Prometheus server端推送它们的 metrics.用于服务层面的 metrics
部署组件

本文以docker方式部署:prometheus、grafana、alertmanager

install prometheus
1
2
3
4
5
6
docker run --name prometheus -d -p 9090:9090  quay.io/prometheus/prometheus
# 暴露端口:9090
docker run --name prometheus -d -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml quay.io/prometheus/prometheus
# 挂载prometheus.yml文件,便于在主机上直接修改
docker run --name prometheus -d -p 9090:9090 --link=alertmanger:alertmanger -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /etc/prometheus/rules:/etc/prometheus/rules quay.io/prometheus/prometheus
# 挂载挂载prometheus.yml文件,创建了rules目录,rules存放告警规则yaml文件,后续会提到
install grafana
1
docker run -d -p 3000:3000 --name=grafana grafana/grafana
install alertmanger
1
2
docker run --name alertmanger -d  -p 9093:9093  -v /etc/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml quay.io/prometheus/alertmanager
#挂载告警文件:alertmanager.yml,便于在主机上直接修改文件
grafana关联prometheus


Prometheus界面,采集promhttp_metric_handler_requests_total为demo进行演示,这个metrics是prometheus自己监控自己的http请求数量

  • 访问grafana,默认用户名和密码都是:admin
  • 设置-type选择Prometheus-填写Prometheus访问地址,点击Save&Test 测试关联prometheus是否成功
  • 新建dashboard,设置Metrics,即可展示数据
prometheus关联alertmanager

prometheus配置文件路径:/etc/prometheus/prometheus.yaml,在如下配置设置告警地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
global:
scrape_interval: 15s
evaluation_interval: 15s
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanger:9093']
# 关联告警服务器alertmanger
scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# prometheus 服务监听的端口

查看prometheus-Status-configuration,检测配置是否生效

prometheus定义告警规则-prom_rules.yml
1
2
3
4
5
6
7
8
9
10
groups:
- name: test-rule
rules:
- alert: promReqCounts
expr: promhttp_metric_handler_requests_total > 10
for: 0s
labels:
prom: http
annotations:
summary: High prometheus request total is above 1000

在prometheus中关联rule文件 - prom_rules.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
global:
scrape_interval: 15s
evaluation_interval: 15s

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanger:9093']
# 关联告警服务器alertmanger
rule_files:
- "rules/prom_rules.yml"
# 定义告警规则:prom_rules.yml
scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# prometheus 服务监听的端口
alertmanager触发告警

配置alertmanager.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
global:
resolve_timeout: 5m

route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.test'
routes:
- receiver: 'web.hook'
match:
prom: http
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:8888'
- name: 'web.test'
webhook_configs:
- url: 'http://127.0.0.1:88888'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']

如果发生了告警,alertmaneger界面会有记录

参考文档

HTTP状态码

  • 200 ok
  • 201 created
  • 202 Accepted
  • 203 Non-Authoritative Information
  • 204 No Content
  • 205 Reset Content
  • 206 Partial Content
  • 207 Multi-Status
  • 208 Already Reported

  • 300 Multiple Choices

  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 305 Use Proxy
  • 307 Temporary Redirect
  • 308 Permanent Redirect

  • 400 Bad Request

  • 401 Unauthorized
  • 402 Payment Required
  • 403 Forbidden
  • 404 Not Found
  • 405 Method Not Allowed
  • 406 Not Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
  • 411 Length Required
  • 412 Precondition Failed
  • 413 Payload Too Large
  • 414 URI Too Long
  • 415 Unsupported Media Type
  • 416 Requested range not satisfiable
  • 417 Expectation Failed
  • 418 I’m a teapot
  • 419 Insufficient Space On Resource
  • 420 Method Failure
  • 421 Destination Locked
  • 422 Unprocessable Entity
  • 423 Locked
  • 424 Failed Dependency
  • 426 Upgrade Required
  • 428 Precondition Required
  • 429 Too Many Requests
  • 431 Request Header Fields Too Large
  • 451 Unavailable For Legal Reasons
  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 505 HTTP Version not supported
  • 506 Variant Also Negotiates
  • 507 Insufficient Storage
  • 508 Loop Detected
  • 509 Bandwidth Limit Exceeded
  • 510 Not Extended
  • 511 Network Authentication Required

more

java

递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestDemo {  
public static void main(String[] args) {
System.out.println(sum(100));
}

public static int sum(int num){
if(num == 1){
return 1;
}
return num + sum(num-1);

}

}

  • 终止条件
  • 递归一下次参数
  • 返回递归函数

hexo+github搭建博客以及主题更换

step1:安装node.js

step2: 安装Hexo

  • 创建一个目录为:hexo
  • cd ~/hexo 进入 ,执行如下命令
  • sudo npm install -g hexo
  • hexo init
  • hexo generate(hexo g也可以,生成静态页面)
  • hexo server (hexo s启动)
  • http://localhost:4000 本地可以访问了

step3: Git配置

  • 初始化Git,提交SSH key到gitHub
  • 建立GitHub repository ,仓库名[ your_git_name].github.io,后面用这个域名直接访问。
  • 配置_config.yml文件,找到deploy节点,修改如下:

    deploy:
    
        type: git
    
        repo: git@github.com:[ your_git_name]/[ your_git_name].github.io.git
    
        branch: master
    

step3: 发布到GitHub

  • 安装Hexo-delpoyer-git
  • npm install hexo-deployer-git –save
  • hexo deploy

step4: 访问博客地址

  • [ your_git_name].github.io

主题更换

  • hexo主题地址:https://hexo.io/themes,我选择的主题是:hexo-theme-next

  • install with git

    1
    2
    cd hexo
    git clone https://github.com/iissnan/hexo-theme-next themes/next
  • update _config.yml

    1
    theme: next 注意:theme和next之间有个空格
  • run

    1
    2
    3
    4
    hexo clean 清理缓存数据
    hexo s --debug
    hexo g 编译
    hexo d 发布

hexo 项目技巧

  • 设置npm 加速
1
2
npm config set registry https://registry.npm.taobao.org
npm get config registry
  • hexo-3.x 手动安装hexo-server

    1
    npm install hexo-server --save
  • mac npm install 权限问题

1
sudo npm install --unsafe-perm=true --allow-root

Linux

查看操作系统信息

1
2
3
4
5
6
7
8
uname -a
cat /proc/version
cat /etc/issue
lsb_release -a

cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l #物理cpu个数 (wc -l 计数)
cat /proc/cpuinfo |grep "processor"|wc -l #逻辑cpu个数
sysctl -a 查询系统参数

centos crontab操作

1
2
3
4
5
6
7
8
9
10
11

cat /ect/crontab
crontab -e
* * * * * date >> /home/date1.txt  测试例子
crontab -l 查看crontab任务列表
crontab -r 终止
tail -f /var/log/cron.log 查看执行日志
/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload

sed 命令操作

1
2
# 替换字符串
sed 's/king/wise2c/g' sed.txt # 将sed.txt文件中的king字眼替换为wise2c

vi/vim 常用命令

1
2
3
4
5
6
7
8
9
10

x 删除当前光标所在处的字符
u 撤销,恢复到上一次操作
e / enter 下一行
h 一行向前移动
dd 删除当前行
/test 查找(test), n 继续查找test

yy 复制一行
p 在游标后面粘贴

查看磁盘问题

1
2
3
4
5
6
7
df -h     查看磁盘使用状态       
df -a -lh 查看全部磁盘使用情况
ls -lh 查看文件大小
du -a 列出所有文件
fdisk -l 列出磁盘信息
du -sh * 查看目录下全部文件的大小
du -d 1 -h / 查看当前目录文件的大小深度:1

yum 命令

1
2
3
4
yum update  xx
yum install xx
yum search xx
yum remove xx

Linux分屏工具tmux

1
2
ctrl+b 松开  % 面板分屏
ctrl+b o 切换

查看内存问题

1
free -h 查看内存大小

web开发命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

curl -I http://www.baidu.com
tar -xf xxx.tar
tar -xzf xxx.tar.gz 解压
top 监控
touch 创建文件
mkdir 创建目录
rm -rf 删除
cp -r xxx/xx/ .
mv xxx/xx yyy/yy 移动
cat xxx.sh 显示
wc -l 统计数量
ss -nltu 查询端口
ss -nltu | grep -e 'tcp' -e 'udp' | awk '{print $5}' | sed 's/.*://' |sort -n |uniq 查询tcp udp 端口
netstat -nltu 查询端口
netstat -nltp |grep TIME_WAIT 查询time_wait的连接
alias name='command line' #设置别名
# 清理内存的cache
echo 1 > /proc/sys/vm/drop_caches

解决linux 大量TIME_WAIT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
netstat  -anp | grep TIME_WAIT | wc -l 统计数量

#解决方案
vi /etc/sysctl.conf

#加入以下参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

#执行
/sbin/sysctl -p

# 动态修改linux 内核参数
sysctl net.ipv4.tcp_fin_timeout=30
sysctl -a 查看全部内核参数变量

查询命令

1
2
3
sort test.txt  #排序
awk '{print $1, $2}' #提取
grep #管道筛选

etcd 命令

1
2
3
4
5
docker ps |grep etcd
export ETCDCTL_API=3
etcdctl --endpoints=http://192.168.0.2:2379 get/set key value
etcdctl --endpoints=http://192.168.0.2:2379 --prefix --keys-only=true get /ingress 查询前缀为ingress的keys
etcdctl --endpoints=http://192.168.0.2:2379 member list 查看成员和状态

logratote(日志轮转)

1
2
3
4
5
当产生大量日志,思路就是:
1: 拆分历史日志
2: 设置过期时间清理历史日志
3: 重新写入新日志
在linux 中可通过logratote实现

清理docker image

1
2
3
docker image   prune     #清理残余和临时文件
docker rmi image-id #删除镜像
docker rmi -f $(docker images -q) #强制删除全部image

从0到1开启jenkins插件开发之路

前言

项目中有这样一个需求,CI部分用jenkins实现拉取代码、编译等,CD需要实现自动部署到公司的Pass平台中,需要CI和CD联动实现自动化,因此需定制开发部署到Pass平台的jenkins插件,本文用一个简单的Demo记录下jenkins插件开发流程,以扩展jenkins构建阶段为例进行介绍.

主要内容包括
1
2
3
4
- 创建jenkins插件项目
- 项目源码分析
- jelly界面开发
- 插件运行、打包、离线安装

Read More

git命令

生成SSH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
git init
# 初始化本地git版本库(创建新仓库)

git config --global user.name "xxx"
# 配置用户名

git config --global user.email "xxx@xxx.com"
# 配置邮件

git config --list
#查看当前配置列表

ssh-keygen -t rsa -C "xxx@xxx.com"
#敲三次回车,在~/.ssh/目录下生产公钥和私钥文件

git clone <url>
# clone远程仓库

修改、提交、删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
git add index.php
# 添加index.php文件到缓存区
git add .
# 添加所有改动过的文件到缓存区
git add --all
# 添加所有文件到缓存区

git commit
# 提交缓存区内的文件(回车后需要键入描述:wq保存退出)
git commit -m "描述"
# 提交缓存区内的文件,并提供描述

git commit -am '描述'
# 将add和commit合为一步
git commit --amend -m 'xxx'
git push --force
# 合并最后一次提交(用于反复修改)

git rm index.php
# 删除index.php文件
git rm --cached index.php
# 将index.php文件移出缓存区,但不删除( -r * 递归目录)
git rm -f 1.html
# 将缓存区中的1.html文件移出并删除

git 回退到指定版本

1
2
3
4

git reset --hard xxx(历史版本号)
git log 查看版本
git push --force 强制推送

查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
git status
# 查看当前版本状态(是否修改)

git diff
# 查看所有添加到缓存区的变更(工作区与版本库的区别)
git diff index.php
# 查看工作区文件和库文件区别
git diff --cached
# 查看所有已添加到缓存区,但还未commit的变更(缓存区与版本库的区别)

git checkout dev
git diff master
# show dev branch diff master branch

git log
# 查看提交历史
git log --oneline
# 以简短的方式查看提交日志
git log -3
# 查看最近3次的提交日志
git reflog
# 行为日志,显示所有提交,回滚等..
git ls-files
# 显示缓存区的所有文件
git log --graph
# 查看日志图形化

tag 标签操作

1
2
3
4
5

git checkout test
git tag v1.0
git tag # 查看标签
git push origin v1.0 #推送标签v1.0到远程

branch 分支操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
git pull origin master
# 获取远程分支master并merge到当前分支

git branch -vv
# 查看本地分支和远程分支是否建立连接

git branch
# 显示本地分支
git branch -r #查看远程分支

git push orgin <branch-name> #推送本地分支到远端

git checkout <branch-name> #切换分支

git checkout - #切换到上一个分支



git branch -a
# 显示所有分支
git checkout 分支名/标签名
# 切换到指定分支或标签

git branch 分支名
# 新建分支
git branch -d 分支名
# 删除本地分支 -D 强制删除

git stash 保存当前进度 。 分别对暂别区和工作区的状态进行保持
git stash list
git stash pop
git stash clear

cherry-pick

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
场景:将master 提交中的ab73c32 提取出到分支:1.6.0-release中

git checkout 1.6.0-release
git chrry-pick ab73c32
git push orgin 1.6.0-release

如果发生冲突:
git - resolve conflict 手动解决冲突

执行: git cherry-pick --continue

放弃本地修改,保持和线上一致

git fetch --all
git reset --hard origin/master
git clean -d -fx 撤销本地修改

git 技巧

1
2
3
4
5
6
7

git checkout 9146467 -- yarn.lock #从某个commit中获取到yarn.lock文件
git log --oneline --no-merges #查看日志过滤掉merge commits信息
git commit -v --amend #重新提交最后一次commit描述信息
git log --pretty=oneline --graph --decorate --all #打印可视化log
git log --since='FEB 10 2016' --until='FEB 19 2016' #查询指定日志的log
git log -S"config.menu_items" #根据commit关键字查询log

merge 合并代码

1
2
3
4
5
场景:将1.6.0-release代码合并到master中
git checkout master
git merge 1.6.0-release
git status #检测冲突
git push origin master

thires ours 解决冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
git checkout test 
git merge master

# 合并master 到test , 当出现冲突
git chekcout --theirs README.md #以master版本为准合并
git chekcout --ours README.md #以test版本为准合并

git commit -am "merge conflicts"
git push

# 解决合并到目标分支(dev)冲突

git rebase dev # 基于当前分支 rebase dev 然后解决冲突即可合并

合并commit

1
2
3
4
5
6
7
8
git rebase -i HEAD~3 
pick xxx
s yyy
s yyy

#如果合并有冲突,解决冲突
git add .
git rebase continue

打包

1
git archive --output xxx/yyy.tar.gz(输出的 目录) v1.4.9(版本)

远程操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
git remote add <remote> <url>
# 添加远程版本库
git remote -v
# 查看远程版本库信息
git remote show <remote>
# 查看指定远程版本库信息
git remote remove <remote>
# 删除远程remote链接
git remote rename <old> <new>
# 重命名远程链接名

git pull <remote> <branch>
# 下载代码及快速合并

git push <remote> <branch>
# 上传代码及快速合并

git merge origin master
# 将本地的远端库合并

git fetch origin
# 将远端库获取本地但不合并

git commit 信息建议

1
2
3
4
5
6
7
8
feat: 新功能
fix: 修复问题
docs: 修改文档
style: 修改代码格式, 不影响代码逻辑
refactor: 重构代码, 理论上不影响现有功能
perf: 提升性能
test: 增加修改测试用例
chore: 修改工具相关(包括但不限于文档, 代码生成等)