本文将为您介绍如何使用 SkyWalking 协议上报 Python 应用数据。
前提条件
Python 使用 SkyWalking 可以实现自动埋点上报,需 Python 3.7及以上版本。
目前我们默认使用 grpc 进行上报。
当前支持自动埋点的组件详情请见 Python Agent 支持框架。
操作步骤
步骤1:获取接入点和 Token
1. 登录 腾讯云可观测平台 控制台。
2. 在左侧菜单栏中选择应用性能监控,单击应用列表 > 接入应用。
3. 在右侧弹出的数据接入抽屉框中,单击 Python 语言。
4. 在接入 Python 应用页面,选择您所要接入的地域以及业务系统。
5. 选择接入协议类型为 Skywalking。
6. 上报方式选择您所想要的上报方式,获取您的接入点和 Token。
说明:
内网上报:使用此上报方式,您的服务需运行在腾讯云 VPC。通过 VPC 直接联通,在避免外网通信的安全风险同时,可以节省上报流量开销。
外网上报:当您的服务部署在本地或非腾讯云 VPC 内,可以通过此方式上报数据。请注意外网通信存在安全风险,同时也会造成一定上报流量费用。
步骤2:安装 SkyWalking Agent 相关依赖
pip install apache-skywalking# 当前demo使用库pip install tornado
步骤3:修改启动代码
from skywalking import agent, configconfig.init(# 此处替换成步骤1中获得的接入点agent_collector_backend_services='ap-guangzhou.apm.tencentcs.com:11800',agent_name='python-skywalking', # 此处可自定义应用名称agent_authentication="xxxxxxxxxxxxxx", # 此处替换成步骤1中获得的Tokenagent_logging_level="INFO")agent.start()
完整 demo 代码如下:
import timeimport tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler):def get(self):print("call")self.write("Hello, world")class SleepHandler(tornado.web.RequestHandler):def get(self):print("call sleep")time.sleep(0.1)self.write("sleep 0.1s")def make_app():return tornado.web.Application([(r"/test", MainHandler),(r"/sleep", SleepHandler),])if __name__ == "__main__":from skywalking import agent, configconfig.init(agent_collector_backend_services='{接入点}', # 此处替换成步骤1中获得的接入点agent_name='python-skywalking',agent_authentication='{token}', # 此处替换成步骤1中获得的Tokenagent_logging_level='INFO')agent.start()app = make_app()port = 9008app.listen(port)print("server in %s" % port)tornado.ioloop.IOLoop.current().start()
步骤4:多线程接入
此步骤可选。完成上面三个步骤,即可在 腾讯云可观测平台 > 应用性能监控 > 应用列表 中看到上报的数据。如果想要多线程接入,可以使用 tornado 包,这里启动需要注意,SkyWalking Agent 需要在进程 fork 之后启动。
引入 tornado 依赖
pip install tornado
完整 demo 代码如下:
import timeimport osimport tornado.ioloopimport tornado.webfrom tornado.httpserver import HTTPServerclass MainHandler(tornado.web.RequestHandler):def get(self):print("call")self.write("Hello, world")class Sleep01Handler(tornado.web.RequestHandler):def get(self):print("call sleep")time.sleep(0.1)self.write("sleep 0.1s")def make_app():return tornado.web.Application([(r"/test", MainHandler),(r"/sleep", Sleep01Handler),])if __name__ == "__main__":from skywalking import agent, configconfig.init(agent_collector_backend_services='{接入点}', # 此处替换成步骤1中获得的接入点agent_name='python-skywalking-multi',agent_authentication='{token}', # 此处替换成步骤1中获得的Tokenagent_logging_level='INFO')app = make_app()port = 9009num_processes = 4sockets = tornado.netutil.bind_sockets(port)tornado.process.fork_processes(num_processes)# 多进程用法,应在fork进程之后启动agent.start()pid = os.getpid()print("Current process ID:%d" % pid)server = HTTPServer(app)server.add_sockets(sockets)print("server in %s" % port)tornado.ioloop.IOLoop.current().start()