prometheus 数据生成报表输出到 docx

1. 环境依赖

首先

npm install -g phantomjs-prebuilt

笔者 python 2.7.15 的环境,requirements.txt 如下:


 jinja2>=2.8

 future

 lml>=0.0.2

 jupyter-echarts-pypkg>=0.1.1

 pyecharts-javascripthon

 pyecharts-snapshot==0.1.10   # > 0.1.10 以上版本仅支持python 3+

 pyecharts==0.5.10  # pyecharts v1 版本仅支持python 3.6+

2. 了解 docx 的结构

推荐两篇文章:

  1. https://www.cnblogs.com/zhanghongfeng/p/7043412.html
  2. https://blog.csdn.net/qwe125698420/article/details/70622289?locationNum=3&fps=1

发现 docx 与 xml 关系密切,所以我们以 xml 为模板,最后从 xml 转换为 docx 文件

3. 我的模板

使用 docx 文件创建模板,另存为 xml 文件

4. 获取 prometheus 数据

利用 prometheus 提供的 http 查询方式获取一组待分析数据。

def get_prom_data():
    url = ("http://{host}:{port}/api/v1/query_range?query=ping_delay<peer='{peer}',"
           "source='{source}'>&start={start_time}&end={end_time}&step=14")
    end_time = time.time()
    start_time = end_time - 3600  # 取 1小时数据
    qyery_url = url.format(host="xx", port="xx", peer="xx", source="xx", 
                           start_time=start_time, end_time=end_time)
    status_url = qyery_url.replace("<", "{").replace(">", "}")

    data = {}
    rsp = do_request(status_url)
    if rsp.get("status", "") == "success" and rsp.get("data", {}).get("result", []):
        data = rsp["data"]["result"][0]["values"]

    if not data:
        raise Exception("prometheus data not found"
    return data

4. 数据制图

使用 pyecharts 将从 prometheus 获取的数据制作城图形,选择合适的图形来表达自己的数据,这里我使用了饼图来表达“链路延迟等级分布”。

from pyecharts import Bar, Pie, Grid, Line, Overlap

def create_a_pic():
    prom_data = get_prom_data()

    attr = ["良好", "正常", "警告", "严重"]
    good, nomal, warn, cri = parse_data(prom_data)

    pie = Pie("链路延迟等级分布图")
    pie.add("delay", attr, [good, nomal, warn, cri], is_random=True, radius=[30, 75])
    pie.render(path="test.png")

5. 生成图片信息流

将图片以 bytes 读取,并使用 base64 加密。

def get_encoded_pic(path):
    """
    将图片转化为字节数据
    :param path: 图片的路径
    :return: 加密的字节数据
    """
    if not os.path.exists(path):
        raise Exception("{} not exists".format(path))
    with open(path, "rb") as f:
        data = base64.standard_b64encode(f.read())
        return data

6. 图片放入模板

将上一步生成的图片信息流放入到模板,其中的难点就是编码问题。懂得Python的都知道python2的编码问题,碰到过的几乎都吐血一升。

def writeback_xml(data):
    """
    data 是编译图片生成的 bytes 格式的字符串,
    data.decode("utf-8")将 bytes 解码成unicode,
    render 之后是 str 格式,但是 f.write() 需要 unicode 格式,
    所以使用 encode("utf-8")
       
    :param data: 图片的字节数据
    :return: 
    """
    env = Environment(loader=FileSystemLoader(PWD))
    template = env.get_template("test.xml")
    with open(NEW_XML_PATH, "wb") as f:
        f.write(template.render(pic=data.decode("utf-8")).encode("utf-8"))
        

6. 完成报表

将上面生成的 xml 文件另存为 docx 格式即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容