通过 SkyWalking 协议接入 Python 应用

最近更新时间:2024-09-20 10:24:52

我的收藏
本文将为您介绍如何使用 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, config
config.init(
# 此处替换成步骤1中获得的接入点
agent_collector_backend_services='ap-guangzhou.apm.tencentcs.com:11800',
agent_name='python-skywalking', # 此处可自定义应用名称
agent_authentication="xxxxxxxxxxxxxx", # 此处替换成步骤1中获得的Token
agent_logging_level="INFO")
agent.start()

完整 demo 代码如下:

import time
import tornado.ioloop
import tornado.web


class 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, config
config.init(agent_collector_backend_services='{接入点}', # 此处替换成步骤1中获得的接入点
agent_name='python-skywalking',
agent_authentication='{token}', # 此处替换成步骤1中获得的Token
agent_logging_level='INFO')
agent.start()
app = make_app()
port = 9008
app.listen(port)
print("server in %s" % port)
tornado.ioloop.IOLoop.current().start()


步骤4:多线程接入

此步骤可选。完成上面三个步骤,即可在 腾讯云可观测平台 > 应用性能监控 > 应用列表 中看到上报的数据。如果想要多线程接入,可以使用 tornado 包,这里启动需要注意,SkyWalking Agent 需要在进程 fork 之后启动。

引入 tornado 依赖

pip install tornado

完整 demo 代码如下:

import time
import os
import tornado.ioloop
import tornado.web
from tornado.httpserver import HTTPServer


class 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, config
config.init(agent_collector_backend_services='{接入点}', # 此处替换成步骤1中获得的接入点
agent_name='python-skywalking-multi',
agent_authentication='{token}', # 此处替换成步骤1中获得的Token
agent_logging_level='INFO')
app = make_app()
port = 9009
num_processes = 4
sockets = 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()