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

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

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

對于分布式追蹤,主要有以下的幾個概念:

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

我實現(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

  # 退出方法中,用來實現(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")
#單獨調(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")

運行結(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)于下一步,會使用redis存儲其結(jié)果,并進行相應(yīng)的輸出分析。

修過不能追蹤同級調(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

  # 退出方法中,用來實現(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")


# 并級連續(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")

# #單獨調(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

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

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

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

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

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

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

    基于Python編寫一個有趣的年會抽獎系統(tǒng)

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

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

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

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

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

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

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

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

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

    使用Django+Pytest搭建在線自動化測試平臺

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

最新評論

临湘市| 西乌珠穆沁旗| 格尔木市| 台中市| 柘荣县| 洛浦县| 宜兰县| 丰顺县| 德江县| 内黄县| 安陆市| 晋宁县| 锦屏县| 沈丘县| 延津县| 越西县| 开封市| 滨州市| 崇礼县| 刚察县| 安陆市| 个旧市| 湛江市| 平安县| 襄樊市| 克拉玛依市| 吉隆县| 芜湖市| 班戈县| 晴隆县| 小金县| 通化市| 靖西县| 呼伦贝尔市| 灵山县| 桓台县| 苍山县| 永仁县| 惠东县| 响水县| 安化县|