prometheusデータ生成レポートdocxへ出力

3302 ワード

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の構造を理解する
2つの記事をお勧めします.
  • https://www.cnblogs.com/zhanghongfeng/p/7043412.html
  • 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&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("", "}")
    
        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で読み取り、base 64を使用して暗号化します.
    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を知っている人はpython 2のコードの問題を知っていて、出会ったことがある人はほとんど血を吐いています.
    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形式として保存すればよい