最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼

 更新時(shí)間:2020年11月27日 12:02:30   作者:-零  
這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

對(duì)于分布式追蹤,主要有以下的幾個(gè)概念:

  • 追蹤 Trace:就是由分布的微服務(wù)協(xié)作所支撐的一個(gè)事務(wù)。一個(gè)追蹤,包含為該事務(wù)提供服務(wù)的各個(gè)服務(wù)請求。
  • 跨度 Span:Span是事務(wù)中的一個(gè)工作流,一個(gè)Span包含了時(shí)間戳,日志和標(biāo)簽信息。Span之間包含父子關(guān)系,或者主從(Followup)關(guān)系。
  • 跨度上下文 Span Context:跨度上下文是支撐分布式追蹤的關(guān)鍵,它可以在調(diào)用的服務(wù)之間傳遞,上下文的內(nèi)容包括諸如:從一個(gè)服務(wù)傳遞到另一個(gè)服務(wù)的時(shí)間,追蹤的ID,Span的ID還有其它需要從上游服務(wù)傳遞到下游服務(wù)的信息。

我實(shí)現(xiàn)了一種簡單的調(diào)用追蹤。

import uuid
import os
import time
l = []
class Recorder(object):
  def __init__(self,servername,root_span = None):
    if root_span == None:
      self.__span = Span(servername)
    else:
      self.__span = Span(servername,root_span)
  #上下文管理器
  def __enter__(self):
    return self.__span

  # 退出方法中,用來實(shí)現(xiàn)善后處理工作
  def __exit__(self, exc_type, exc_val, exc_tb):
    self.__span.record()
    self.__span.record_save(self.__span.span)
class Span(object):
  def __init__(self,servername,root_span = None):
    self.servername = servername
    self.span = self.newspan()
    if root_span != None:
      root_span.dic['child_span'] = self.span
      self.span["root_span_flag"] = False
  def newspan(self):
    self.dic = {
      "spanid": uuid.uuid4().int,
      "servername": self.servername,
      "location": "",
      "ip": "",
      "durationtime": 0,
      "starttime": time.time(),
      "endtime":0,
      "tag": "",
      "log": "",
      "root_span_flag":True,
      "child_span": ""
    }
    return self.dic

  def record_save(self, span):
    currenttracer = {"id": span["spanid"], "data": span}
    print(currenttracer)
    l.append(currenttracer)

  def record(self):
    self.span["servername"] = self.servername
    self.span["location"] = os.getcwd() + "." + self.servername
    self.span["endtime"] = time.time()
    self.span["durationtime"] = self.span["endtime"] - self.span["starttime"]

  def setspantag(self,tag):
    self.span["tag"] = tag

  def setspanlog(self,log):
    self.span["log"] = log

# 連續(xù)調(diào)用
with Recorder('server1') as span:
  time.sleep(1)
  span.setspantag("test")
  #調(diào)用server1方法
  print("server1")
  with Recorder('server2',span) as span1:
    time.sleep(2)
    # 調(diào)用server2方法
    print("server2")
    with Recorder('server3',span1) as span2:
      time.sleep(0.5)
      # 調(diào)用server3方法
      print("server3")
#單獨(dú)調(diào)用記錄
with Recorder('server4') as span_test1:
  time.sleep(1.5)
  print("server4")

with Recorder('server5') as span_test2:
  time.sleep(2)
  print("server5")

運(yùn)行結(jié)果:

server1
server2
server3
{'id': 224716339449765695394515303164364012192, 'data': {'spanid': 224716339449765695394515303164364012192, 'servername': 'server3', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server3', 'ip': '', 'durationtime': 0.5004403591156006, 'starttime': 1598947338.0551107, 'endtime': 1598947338.555551, 'tag': '', 'log': '', 'root_span_flag': False, 'child_span': None}}
{'id': 254736847532758359233387151739984206570, 'data': {'spanid': 254736847532758359233387151739984206570, 'servername': 'server2', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server2', 'ip': '', 'durationtime': 2.501264810562134, 'starttime': 1598947336.0542862, 'endtime': 1598947338.555551, 'tag': '', 'log': '', 'root_span_flag': False, 'child_span': {'spanid': 224716339449765695394515303164364012192, 'servername': 'server3', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server3', 'ip': '', 'durationtime': 0.5004403591156006, 'starttime': 1598947338.0551107, 'endtime': 1598947338.555551, 'tag': '', 'log': '', 'root_span_flag': False, 'child_span': None}}}
{'id': 91028031631192607088457781914309166266, 'data': {'spanid': 91028031631192607088457781914309166266, 'servername': 'server1', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server1', 'ip': '', 'durationtime': 3.5021069049835205, 'starttime': 1598947335.0534441, 'endtime': 1598947338.555551, 'tag': 'test', 'log': '', 'root_span_flag': True, 'child_span': {'spanid': 254736847532758359233387151739984206570, 'servername': 'server2', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server2', 'ip': '', 'durationtime': 2.501264810562134, 'starttime': 1598947336.0542862, 'endtime': 1598947338.555551, 'tag': '', 'log': '', 'root_span_flag': False, 'child_span': {'spanid': 224716339449765695394515303164364012192, 'servername': 'server3', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server3', 'ip': '', 'durationtime': 0.5004403591156006, 'starttime': 1598947338.0551107, 'endtime': 1598947338.555551, 'tag': '', 'log': '', 'root_span_flag': False, 'child_span': None}}}}
server4
{'id': 103171729522922437998918618387133480096, 'data': {'spanid': 103171729522922437998918618387133480096, 'servername': 'server4', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server4', 'ip': '', 'durationtime': 1.5001769065856934, 'starttime': 1598947338.555551, 'endtime': 1598947340.055728, 'tag': '', 'log': '', 'root_span_flag': True, 'child_span': None}}
server5
{'id': 320091321623887285825256878422834254741, 'data': {'spanid': 320091321623887285825256878422834254741, 'servername': 'server5', 'location': 'D:\\python_protest\\protest\\trace\\trace_main.server5', 'ip': '', 'durationtime': 2.0005736351013184, 'starttime': 1598947340.055728, 'endtime': 1598947342.0563016, 'tag': '', 'log': '', 'root_span_flag': True, 'child_span': None}}

關(guān)于下一步,會(huì)使用redis存儲(chǔ)其結(jié)果,并進(jìn)行相應(yīng)的輸出分析。

修過不能追蹤同級(jí)調(diào)用的問題

import uuid
import os
import time


l = []
class Recorder(object):
  def __init__(self,servername,root_span = None):
    if root_span == None:
      self.__span = Span(servername)
    else:
      self.__span = Span(servername,root_span)

  #上下文管理器
  def __enter__(self):
    return self.__span

  # 退出方法中,用來實(shí)現(xiàn)善后處理工作
  def __exit__(self, exc_type, exc_val, exc_tb):
    self.__span.record()
    self.__span.record_save(self.__span.span)


class Span(object):
  def __init__(self,servername,root_span = None):
    self.servername = servername
    self.span = self.newspan()
    if root_span != None:
      root_span.dic['child_span'].append(self.span)
      self.span["root_span_flag"] = False

  def newspan(self):
    self.dic = {
      "spanid": uuid.uuid4().int,
      "servername": self.servername,
      "location": "",
      "ip": "",
      "durationtime": 0,
      "starttime": time.time(),
      "endtime":0,
      "tag": "",
      "log": "",
      "root_span_flag":True,
      "child_span": []
    }
    return self.dic

  def record_save(self, span):
    currenttracer = {"id": span["spanid"], "data": span}
    print(currenttracer)
    l.append(currenttracer)

  def record(self):
    self.span["servername"] = self.servername
    self.span["location"] = os.getcwd() + "." + self.servername
    self.span["endtime"] = time.time()
    self.span["durationtime"] = self.span["endtime"] - self.span["starttime"]

  def setspantag(self,tag):
    self.span["tag"] = tag

  def setspanlog(self,log):
    self.span["log"] = log



# 連續(xù)調(diào)用
with Recorder('server1') as span:
  time.sleep(1)
  span.setspantag("test")
  #調(diào)用server1方法
  print("server1")
  with Recorder('server2',span) as span1:
    time.sleep(2)
    # 調(diào)用server2方法
    print("server2")
    with Recorder('server3',span1) as span2:
      time.sleep(0.5)
      # 調(diào)用server3方法
      print("server3")


# 并級(jí)連續(xù)調(diào)用
# with Recorder('server1') as span1:
#   time.sleep(1)
#   span1.setspantag("test")
#   #調(diào)用server1方法
#   print("server1")
#   with Recorder('server2',span1) as span2:
#     time.sleep(2)
#     # 調(diào)用server2方法
#     print("server2")
#   with Recorder('server3',span1) as span3:
#     time.sleep(0.5)
#     # 調(diào)用server3方法
#     print("server3")

# #單獨(dú)調(diào)用記錄
# with Recorder('server4') as span_test1:
#   time.sleep(1.5)
#   print("server4")
#
# with Recorder('server5') as span_test2:
#   time.sleep(2)
#   print("server5")

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)連接MySql數(shù)據(jù)庫及增刪改查操作詳解

    Python實(shí)現(xiàn)連接MySql數(shù)據(jù)庫及增刪改查操作詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)連接MySql數(shù)據(jù)庫及增刪改查操作,結(jié)合實(shí)例形式詳細(xì)分析了Python安裝PyMySQL模塊及使用PyMySQL模塊進(jìn)行mysql數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Python中讀取Excel最快的幾種常見方法

    Python中讀取Excel最快的幾種常見方法

    本文詳細(xì)介紹了使用Python讀取Excel文件的多種方法,介紹了pandas、openpyxl、xlrd、xlwt、pyexcel、Tablib、LibreOffice、DuckDB和Calamine等庫的用法和特點(diǎn),每種方法適用于不同的場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 打包FlaskAdmin程序時(shí)關(guān)于static路徑問題的解決

    打包FlaskAdmin程序時(shí)關(guān)于static路徑問題的解決

    近期寫了個(gè)基于Flask-admin的數(shù)據(jù)庫管理程序,通過pyinstaller打包,給別人用,經(jīng)過幾次嘗試,打包的數(shù)據(jù)一直找不到static里面的樣式文件,查閱資料后,最總把問題搞定了。寫下處理流程,供后來人參考
    2021-09-09
  • python3.x?zip用法小結(jié)

    python3.x?zip用法小結(jié)

    這篇文章主要介紹了python3.x?zip用法詳解,通過一個(gè)簡單例子給大家詳細(xì)講解zip使用,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 基于Python編寫一個(gè)有趣的年會(huì)抽獎(jiǎng)系統(tǒng)

    基于Python編寫一個(gè)有趣的年會(huì)抽獎(jiǎng)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個(gè)簡易的抽獎(jiǎng)系統(tǒng),順便幫助大家鞏固一下對(duì)Python語法和框架的理解,感興趣的小伙伴可以了解下
    2023-12-12
  • Python面向?qū)ο缶幊袒A(chǔ)解析(二)

    Python面向?qū)ο缶幊袒A(chǔ)解析(二)

    這篇文章主要介紹了Python面向?qū)ο缶幊袒A(chǔ)解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Python編程應(yīng)用設(shè)計(jì)原則詳解

    Python編程應(yīng)用設(shè)計(jì)原則詳解

    什么是好用的代碼呢?其實(shí)就是代碼質(zhì)量比較高,如何評(píng)價(jià)代碼質(zhì)量的高低呢?最常用的、最重要的評(píng)價(jià)標(biāo)準(zhǔn),就是代碼的可維護(hù)性、可讀性、可擴(kuò)展性、靈活性、簡潔性、可復(fù)用性、可測試性
    2021-09-09
  • fastcgi文件讀取漏洞之python掃描腳本

    fastcgi文件讀取漏洞之python掃描腳本

    這篇文章主要介紹了fastcgi文件讀取漏洞之python掃描腳本,需要的朋友可以參考下
    2017-04-04
  • Python深度學(xué)習(xí)理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化

    Python深度學(xué)習(xí)理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化

    這篇文章主要是Python深度學(xué)習(xí)篇,通過示例的詳解讓大家更好的理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化,有需要的的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 使用Django+Pytest搭建在線自動(dòng)化測試平臺(tái)

    使用Django+Pytest搭建在線自動(dòng)化測試平臺(tái)

    最近由于公司的發(fā)展安排本人實(shí)現(xiàn)公司項(xiàng)目的自動(dòng)化測試,下面這篇文章主要給大家介紹了關(guān)于如何Django?+?Pytest搭建在線自動(dòng)化測試平臺(tái)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

沅江市| 张家界市| 灵璧县| 喜德县| 巴彦县| 紫云| 辽源市| 株洲市| 陆丰市| 宜黄县| 睢宁县| 兴宁市| 冀州市| 公主岭市| 察雅县| 鹰潭市| 南召县| 鱼台县| 维西| 丰县| 西华县| 宁陕县| 肇源县| 呼玛县| 桑植县| 永寿县| 莒南县| 咸丰县| 郯城县| 济阳县| 鄂托克前旗| 清河县| 安化县| 白朗县| 大渡口区| 杭锦旗| 大邑县| 时尚| 固镇县| 弥渡县| 长泰县|