skywalking-python介绍与使用
Skywalking--python 介绍与使用
为什么要引入skywalking?
-
在用户发现问题前,提前知晓服务问题
-
服务发生问题时,无从下手;没有日志采集系统查日志,如果是负载均衡方式,不能很快定位问题
-
提升现有服务的服务质量,提升用户感知度,有利于调优接口性能
-
选型
skywalking 已经成为apache顶级项目,社区活跃,易二次开发,消耗服务资源相对最少,对java支持最好,但对Python支持也友好,也有其他语言的各种agent,如golang,易于之后微服务化容器化后多语言并存
skywalking的架构
- skywalking 前端UI 用的是skywalking -Rocketbot,VUE实现,可以做二次开发
- Storage可以用mysql influxdb等,我们选择ES,也不用重复搭建ELK做日志采集分析
python集成skywalking
- pip install apache-skywalking 安装包
- 在flask启动py中导入skywalking
# -*- coding:utf-8 -*-
##导入skywalking链路监控 开始
from skywalking import agent, config
#config.disable_plugins = ['sw_http_server', 'sw_urllib_request','sw_django','sw_tornado','sw_urllib3','sw_sanic','sw_aiohttp','sw_pyramid']#也可以排除一些不想纳入跟踪的组件
config.init(collector='ip:11800', service='songling') #采集服务的地址,给自己的服务起个名称
config.flask_collect_http_params = True # flask接收到的http参数也保存
agent.start()
##导入结束
import logging
from framework import app
if __name__ != '__main__': #gunicorn 启动
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
if __name__ == '__main__':#flask 启动
app.run(host=app.config["HOST"], port=app.config["PORT"], debug=app.config["DEBUG_MODEL_SWITCH"])
- 启动flask时,会在日志看到类似信息
skywalking [MainThread] [WARNING] failed to install plugin sw_aiohttp
skywalking [MainThread] [WARNING] failed to install plugin sw_django
skywalking [MainThread] [WARNING] failed to install plugin sw_elasticsearch
这些是系统中没有引入的组件,如果发现pymysql也没有引入,是因为配置mysql驱动时需要配置成mysql+pymysql(不引入pymysql组件,跟踪中就没有访问mysql的相关数据)
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://*******"
-
对于gunicorn发布的flask服务,一定注意
worker_class = 'sync'
worker_class不能是gevent,也不用在flask启动py中引入与gevent相关包,如import gevent.monkey.(目前还不知具体原因)
Python集成skywalking的plugin原理
几行代码就能把需要的链路 跨度信息反馈到skywalking?
# -*- coding:utf-8 -*-
# @Time : 2021/3/4 20:27
# @Author: sl
class MyFlask():
def method_old(self):
print("假定flask执行逻辑")
_method_old=MyFlask.method_old
def method_new(this:MyFlask):
print("加入执行前逻辑")
_method_old(this)
print("加入执行后逻辑")
MyFlask.method_old = method_new #类方法替换,包装了原来的方法,类似java切面
my = MyFlask() #替换后,再涉及flask服务都会被拦截处理
my.method_old()
plugin开发遵循 OpenTraing规范,每个调用都是一个Span(跨度),一个Span有多个子Span。如,一次访问flask接口,就产生一个flask_Span,这个接口内部访问了mysql数据库,又产生了一个mysql_Span,每次访问都会分配一个TraceID,在http访问时该id存在于head中,在mq访问时存在于附加消息中。这样每次访问的一个链条通过traceid串联起来。简单理解一下即可,除非去开发plugin
UI主要观测点
-
Apdex是用户体验指标,满意度的量化值,在0到1区间,越趋近于1,说明大部分访问的延迟是越理想的,对用户的响应很快
-
Service Avg Responde Time 响应时间曲线,Service Responde Time Percentile是响应时间的百分比,P75值170就是在选定的时间范围内,百分之75的请求,都在170毫秒完成
-
Successful Rate 如果不是100,说明在选定时间范围内,有错误的请求出现
-
Service Load 服务每分钟请求数
选定的时间在展示界面切换的时候是不变的
- CPM 每分钟某端点被调用次数,被调用次数多的接口,看是否还有优化空间
- Slow Endpoint 是某个接口平均响应时间,越响应慢的接口越排在前面。如果接口响应过慢,就一定要调整接口代码
- SuccessFul Rate 如果接口成功率不是100,提示出现了访问异常,需要及时查看接口日志,解决问题
主要是以拓扑的形式展示服务和与服务交互的其他服务或数据库 中间件的调用关系,
在这可以配置一些服务所属组,来区分每个负责人,对应自己负责的服务状况
追踪某个服务的所有接口调用情况,可以查到具体调用所花费时间,请求了哪个中间件或数据库。对于数据库访问的Span可以查看具体请求的sql语句
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)