抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

[toc]

业务服务监控详解

业务服务监控是运维体系中最重要的环节,是保证业务服务质量的关键手段。如何更有效地实现业务服务
是每个运维人员应该思考的问题,不同业务场景需定制不同的监控策略。Python在监控方面提供了大量
的第三方式具,可以帮助我们快速、有效地开发企业级服务监控平台,为我们的业务保驾护航。

文件内容差异对比方法

通过difflib模块实现文件内容差异比对。difflib作为Python的标准库模块,无需安装,作用是对比
文本之间的差异,且支持输出可读性较强的HTML档,与linux下的diff命令相似。 我们可以使用
difflib对比代码、配置文件的差别,在版本控制方在是非常有用的。python2.3或者更高版本默认
自带difflib模块

两个字符串的差异对比

通过使用difflib模块实现两个字符串的差异对比,然后以版本控制风格进行输出

➜  test cat diff.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import difflib
text1 = """text1: 
This module provides classes and funcitons for compring sequences.
including HTML and context and unified diffs. 
difflib document v7.4
add sring 
"""
text1_lines = text1.splitlines() #以行进行分隔,以便进行对比  
text2 = """text2
This module provides classes and functions for Comparing sequences. 
including HTML and context and unified diffs. 
difflib document v7.5
"""
text2_lines = text2.splitlines() 
d = difflib.Differ()
diff = d.compare(text1_lines, text2_lines) # 采用compare方法对字符串进行比较
print '\n' .join(list(diff))

# 示例结果
➜  test python diff.py 
- text1: 
+ text2
- This module provides classes and funcitons for compring sequences.
?                                       -        ^

+ This module provides classes and functions for Comparing sequences. 
?                                      +         ^   +               +

  including HTML and context and unified diffs. 
- difflib document v7.4
?                     ^

+ difflib document v7.5
?                     ^

- add sring 
➜  test

符号说明

'_'   '包含在第一个序列行中,但不包含在第二个序列行'
'+'   '包含在第二个序列行中,但不包含在第一个序列行'
''      '两个序列行一致'
'?'   '标志两个序列行存在增量差异'
'^'      '标志出两个序列行存在的差异字符'

生成美观的对比HTML格式文档

采用HtmlDiff()类的make_file() 方法就可以生成美观的HTML文档

d  = difflib.Differ()
diff = d.compare(text1_lines, text2_lines)
print '\n' .join(list(diff))

替换成:

d = difflib.HtmlDiff()
print d.make_file(text1_lines, text2_lines)

对比Nginx配置文件差异

当我们维护多个Nginx配置时,时常会对比不同版本的配置文件的差异,使用运维人员更加清晰地
了解不同版本迭代的更新项,实现的思路是读取两个需对比的配置文件,再以换行符作为分隔符
调用 difflib.HtmlDiff() 生成HTML格式的差异文档

scp diff_nginx.py root@www.ssjinyao.com:/root/
diff_nginx.py                                                                                                                                                                                               100% 1035     1.0KB/s   00:00    
➜  test ssh root@www.ssjinyao.com       
Last failed login: Thu Jan 18 15:55:31 CST 2018 from 140.205.201.39 on ssh:notty
There were 48 failed login attempts since the last successful login.
Last login: Tue Jan 16 10:06:45 2018 from 111.198.29.81

Welcome to Alibaba Cloud Elastic Compute Service !

[root@iz2zearhdmowvugecyh820z ~]# vim diff_nginx.py 
[root@iz2zearhdmowvugecyh820z ~]# python diff_nginx.py /etc/nginx/conf.d/leleol.conf  /etc/nginx/conf.d/hexo.conf > /var/www/ssjinyao/diff_nginx.html
[root@iz2zearhdmowvugecyh820z ~]# cat diff_nginx.py 
#!/bin/bash/env python 
# -*- coding: utf-8 -*-
import difflib
import sys 

try:
    textfile1 = sys.argv[1] #第一个配置文件路径参数 
    textfile2 = sys.argv[2] #第二个配置文件路径参数

except Exception, e:
    print "Error:" + str(e)
    print "Usage: diff_nginx.py filename1 filename2"
    sys.exit()

def readfile(filename):  # 文件读取分隔函数
    try:
        fileHandle = open (filename, 'rb' )
        text=fileHandle.read() .splitlines() #读取后以行进行分隔
        fileHandle.close()
        return text 

    except IOError as error: 
        print ('Read file Error:' +str(error))
        sys.exit()
    if textfile1 == "" or textfile2 == "":
        print "Usage: diff_nginx.py filename1 filename2 "
        sys.exit()

text1_lines = readfile(textfile1) #调用readfile函数,获取分隔后的字符串
text2_lines = readfile(textfile2) 

d = difflib.HtmlDiff() #创建HtmlDiff()类对象
print d.make_file(text1_lines,text2_lines)  #通过make_file方法输出HTML的对比结果
https://www.ssjinyao.com/diff_nginx.html

评论