返回顶部
首页 > 资讯 > 后端开发 > Python >python是怎么实现skywalking的trace模块过滤和报警
  • 485
分享到

python是怎么实现skywalking的trace模块过滤和报警

2023-06-25 21:06:20 485人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

python是怎么实现skywalking的trace模块过滤和报警,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  skywalking本身的报警功能

python是怎么实现skywalking的trace模块过滤和报警,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

  skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发。所以自己就用Python对skywalking做了二次数据清洗实现。项目方在了自己了GitHubhttps://github.com/shygit-dev/skywalking-cli-python)上了,有兴趣的同学可以做二次改造,共同学习。下面简单列出了代码内容:

sw-trace.py

#!/usr/bin/env python# _*_ coding: utf-8 _*_# Tile:# Author:shyimport requestsimport timeimport smtplibfrom email.mime.text import MIMETextimport redef interface_content_filter(trace_id):    '''    对详细日志内容(业务逻辑报错)进行过滤    :param trace_id:    :return: 【1|0】    '''    url = "Http://172.16.53.232:50001/query"    params = {        "trace_id": trace_id    }    detail_trace_id_log = requests.request(method="GET",url=url,params=params)    detail_trace_id_log = detail_trace_id_log.text    print(detail_trace_id_log)    print(type(detail_trace_id_log))    with open("blackname_keyWord_list","r",encoding="utf-8") as f:        for line in f:            print(line)            result = re.search(line.strip(),detail_trace_id_log)            print(result)            if result != None:                print("哥们匹配到日志黑名单关键字了:%s" % line)                return 0    print("提示:%s不在关键字黑名单中" % trace_id)    return 1def interface_filter(endpointName):    """    设置接口黑名单    :param endpointName:    :return: 【1|0】    """    endpointName = re.sub("\(|\)",".",endpointName)    with open("blackname_list","r",encoding="utf-8") as f:        bn_list = f.read()    match_result = re.search(endpointName.strip(),bn_list)    if match_result == None:        print("提示:接口不存在黑名单中")        return 1    print("提示:接口在黑名单中")    return 0def trace_erro_interface(start_time,end_time,sw_url,per_page_size,trace_detail_addr):    """    skywalking trace功能对错误接口进行过滤,默认最大一次获取2000条数据,每分钟执行一次    :param start_time:    :param end_time:    :return:    """    url = sw_url    data = {          "query": "query queryTraces($condition: TraceQueryCondition) {\n  data: queryBasicTraces(condition: $condition) {\n    traces {\n      key: segmentId\n      endpointNames\n      duration\n      start\n      isError\n      traceIds\n    }\n    total\n  }}",          "variables": {            "condition": {              "queryDuration": {                "start": start_time, #"2021-12-07 1734"                "end": end_time,                "step": "MINUTE"              },              "traceState": "ERROR",              "paging": {                "pageNum": 1,                "pageSize": per_page_size,                "needTotal": "true"              },              "queryOrder": "BY_START_TIME"              # "traceId": "b669d0069be84fce82261901de412e7c.430.16388637511348105"            }          }        }    result = requests.request(method="post",url=url,JSON=data)    i = 0    # print(result.content)    # print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(float("%s.%s" % (trace["start"][0:10],trace["start"][10:])))))    with open("mail.html","w",encoding="utf-8") as f:        f.write('<head><meta charset="UTF-8"><title>Title</title><style>.t {border-right: 2px solid black;border-bottom: 2px solid black;}.t th,td {border-top: 2px solid black;border-left: 2px solid black;font-size: 10px;}</style></head><body><div >最近15分钟统计:</div><table class="t" border="0" cellspacing="0" cellpadding="10px"><thead><tr width: 100px;">时间</th><th>持续时长</th><th>接口名称</th><th>追踪ID</th></tr></thead><tbody>')    for trace in result.json()["data"]["data"]["traces"]:        # print(trace["endpointNames"])        print("时间:%s\n" % time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(float("%s.%s" % (trace["start"][0:10],trace["start"][10:])))),              "持续时长:%s\n" % trace["duration"],              "接口名称:%s\n" % trace["endpointNames"][0],              "跟踪ID:%s" % trace["traceIds"][0])        # print(time.localtime(1638869640.194))        i+=1        print(i)        s_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(float("%s.%s" % (trace["start"][0:10],trace["start"][10:]))))        dur_time =  trace["duration"]        endpointName = trace["endpointNames"][0]        trace_id = trace["traceIds"][0]        # 调用接口黑名单过滤功能        result = interface_filter(endpointName)        if result == 0:            print("哥们进入黑名单了!",endpointName)            continue        # 调用关键字黑名单过滤功能        keyword_result = interface_content_filter(trace_id)        if keyword_result == 0:            print("哥们进入关键字黑名单了!", trace_id)            continue        with open("mail.html","a",encoding="utf-8") as f:            f.write('<tr><td>%s</td><td>%s</td><td>%s</td><td><a href="http://%s/query?trace_id=%s" rel="external nofollow" >%s</a></td></tr>' %(s_time,dur_time,endpointName,trace_detail_addr,trace_id,trace_id))    with open("mail.html","a",encoding="utf-8") as f:        f.write('</tbody></table></body>')def send_mail(receiver):    """    发送报错接口邮件    :return:    """    server = "mail.test.com"    sender = "sa@test.com"    sender_pwd = "1qaz@WSX"    send_addr = "sa@test.com"    receiver = receiver    with open("mail.html","r",encoding="utf-8") as f:        content = f.read()    if re.search("<td>",content) == None:        print("无报错接口!",content)        return 0    print("邮件前",content)    msg_mail = MIMEText(content,"html","utf-8")    msg_mail["Subject"] = "Skywalking报错接口统计"    msg_mail["From"] = sender    msg_mail["To"] = receiver    server_obj = smtplib.SMTP_SSL(server)    server_obj.connect(server,465)    server_obj.login(sender,sender_pwd)    server_obj.sendmail(send_addr,receiver,msg_mail.as_string())if __name__ == "__main__":    # 设定查询时间间隔,默认900s(15min)    end_time = time.time()    start_time = end_time - 900    start_time=time.strftime("%Y-%m-%d %H%M",time.localtime(start_time))    end_time = time.strftime("%Y-%m-%d %H%M", time.localtime(end_time))    print(start_time)    print(end_time)    sw_url = "http://172.16.53.232:9412/graphql" # skywalking的前端服务的地址和端口    per_page_size = 5000  #指定一次获取endpoint接口的数目    trace_detail_addr = "127.0.0.1:5000" #指定查询指定trace_id详细日志    receiver = "shy@test.com"  #报警邮件接收人地址    trace_erro_interface(start_time,end_time,sw_url,per_page_size,trace_detail_addr)    send_mail(receiver)    # interface_filter()    # interface_content_filter("3c4212dd2dd548d394ba312c4619405d.104.16390380592724487")

sw-trace-id.py

#!/usr/bin/env python# _*_ coding: utf-8 _*_# Tile:# Author:shyimport requestsimport timefrom flask import Flask,requestapp = Flask(__name__)@app.route("/query",methods=["get"])def trace_id_query():    """    查询指定trace_id详细日志信息    :return: f.read()    """    trace_id = request.args.get("trace_id")    url="http://172.16.53.232:9412/graphql"    # url="http://skywalking.roulw.com/graphql"    data = {      "query": "query queryTrace($traceId: ID!) {\n  trace: queryTrace(traceId: $traceId) {\n    spans {\n      traceId\n      segmentId\n      spanId\n      parentSpanId\n      refs {\n        traceId\n        parentSegmentId\n        parentSpanId\n        type\n      }\n      serviceCode\n      serviceInstanceName\n      startTime\n      endTime\n      endpointName\n      type\n      peer\n      component\n      isError\n      layer\n      tags {\n        key\n        value\n      }\n      logs {\n        time\n        data {\n          key\n          value\n        }\n      }\n    }\n  }\n  }",      "variables": {        "traceId": trace_id      }    }    result = requests.request(method="post",url=url,json=data)    with open("detail_log", "w", encoding="utf-8") as f:        f.write("<div style='color: red;font-size: 30px;'>生产Skywalking报错接口跟踪日志日志:<br /></div>")    for trace_id in result.json()["data"]["trace"]["spans"]:        if trace_id["isError"]:            # print(trace_id)            print("服务名称:%s\n" % trace_id["serviceCode"],                  "开始时间:%s\n" % trace_id["startTime"],                  "接口名称:%s\n" % trace_id["endpointName"],                  "peer名称:%s\n" % trace_id["peer"],                  "tags名称:%s\n" % trace_id["tags"],                  "详细日志:%s" % trace_id["logs"])            content = "服务名称:%s<br />开始时间:%s<br />接口名称:%s<br />peer名称:%s<br />tags名称:%s" % (trace_id["serviceCode"],trace_id["startTime"],trace_id["endpointName"],trace_id["peer"],trace_id["tags"])            with open("detail_log","a",encoding="utf-8") as f:                f.write(content)                f.write("<br />********详细日志**********<br />")            for logs in trace_id["logs"]:                for log in logs["data"]:                    if log["key"] == "message":                        print(log["value"])                        with open("detail_log","a",encoding="utf-8") as f:                            f.write(log["value"])                        # return log["value"]                    elif log["key"] == "stack":                        print(log["value"])                        with open("detail_log","a",encoding="utf-8") as f:                            f.write(log["value"])            with open("detail_log", "a", encoding="utf-8") as f:                f.write("<div style='color: red;font-size: 20px;'><br />========下一个接口信息=========<br /></div>")    with open("detail_log","r",encoding="utf-8") as f:        return f.read()if __name__ == "__main__":    # trace_id = "14447ae7199c40a2b9862411daba180b.2142.16388920322367785"    # trace_id_query(trace_id)    app.run()

关于python是怎么实现skywalking的trace模块过滤和报警问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网Python频道了解更多相关知识。

--结束END--

本文标题: python是怎么实现skywalking的trace模块过滤和报警

本文链接: https://lsjlt.com/news/306316.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python是怎么实现skywalking的trace模块过滤和报警
    python是怎么实现skywalking的trace模块过滤和报警,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  skywalking本身的报警功能...
    99+
    2023-06-25
  • python实现skywalking的trace模块过滤和报警(实例代码)
      skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发。所以自己就用python对sk...
    99+
    2024-04-02
  • ASP.NET的HTTP模块和处理程序的模块实现是怎样的
    本篇文章给大家分享的是有关ASP.NET的HTTP模块和处理程序的模块实现是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现一个提供安全服务的HTTP模块现在我们实现一...
    99+
    2023-06-17
  • PHP中利用路由模块实现URL重定向和参数过滤的方法
    随着互联网的发展,网站的访问量不断增加,URL的处理变得更加重要。为了提高网站的安全性和可维护性,我们需要对URL进行重定向和参数过滤。在PHP中,可以通过路由模块来实现这些功能。本文将介绍如何使用路由模块实现URL重定向和参数过滤,并提供...
    99+
    2023-10-21
    URL重定向 路由模块 参数过滤
  • 怎么用Python实现强大的 logging 模块
    本篇内容介绍了“怎么用Python实现强大的 logging 模块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • Python模块怎么实现简单的调用
    这篇文章给大家分享的是有关Python模块怎么实现简单的调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通...
    99+
    2023-06-14
  • python opencv图像的高通滤波和低通滤波怎么实现
    这篇文章主要介绍“python opencv图像的高通滤波和低通滤波怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python opencv图像的高通滤波和低通滤波怎么实...
    99+
    2023-07-02
  • AngularJS怎么通过ocLazyLoad实现动态懒加载模块和依赖
    这篇文章将为大家详细讲解有关AngularJS怎么通过ocLazyLoad实现动态懒加载模块和依赖,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现的过程主要是引用3个主...
    99+
    2024-04-02
  • python监控日志中的报错并进行邮件报警怎么实现
    今天小编给大家分享一下python监控日志中的报错并进行邮件报警怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现思...
    99+
    2023-07-02
  • python是怎么实现简单的俄罗斯方块
    本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-26
  • Python怎么利用shutil模块实现文件的裁剪与压缩
    本篇内容介绍了“Python怎么利用shutil模块实现文件的裁剪与压缩”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!利用 shutil 实...
    99+
    2023-06-30
  • Python中的并发编程模型和设计模式的选择和实现原则是什么?
    Python中的并发编程模型和设计模式的选择和实现原则随着计算机性能的提升和需求的增加,同时处理多个任务的能力已经成为了现代编程不可或缺的一部分。在Python中,我们可以利用并发编程来实现并行执行多个任务的目的。在这篇文章中,我们将讨论P...
    99+
    2023-10-26
    多线程 协程 异步编程 并发编程模型: 设计模式:
  • 通过抓包实现Python模拟登陆各网站的原理分析是怎样的
    这篇文章将为大家详细讲解有关通过抓包实现Python模拟登陆各网站的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  一、教程简介  1.1 基本介绍(私信小编001 、00...
    99+
    2023-06-02
  • python多进程中的生产者和消费者模型怎么实现
    这篇文章主要介绍了python多进程中的生产者和消费者模型怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python多进程中的生产者和消费者模型怎么实现文章都会有所收获,下面我们一起来看看吧。Pytho...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作