iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >zipkin微服务调用链分析(python)
  • 517
分享到

zipkin微服务调用链分析(python)

zipkinpython 2023-01-31 08:01:12 517人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

zipkin的作用在微服务架构下,一个Http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作,如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价值,zipkin帮助我们实现了这一监控功能。&n

zipkin的作用

微服务架构下,一个Http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作,
如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价值,
zipkin帮助我们实现了这一监控功能。

 

环境说明

操作系统Centos 7.6

ip:192.168.31.232

配置:2核4g

python版本:3.5.2

 

启动zipkin

启动方式有2种,一个是docker,一个jar包。任选其一即可。

本文采用jar包方式启动

Docker

docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin

 

jar

wget https://dl.bintray.com/openzipkin/Maven/io/zipkin/java/zipkin-server/2.12.9/zipkin-server-2.12.9-exec.jar
java -jar zipkin-server-2.12.9-exec.jar

 

访问zipkin

http://192.168.31.232:9411

 

效果如下:

1.png

 

 

使用py_zipkin模块来实现,这里以flask项目测试

安装模块

pip3 install  py_zipkin pyMysql flask

 

创建项目

新建demo.py

mkdir -p /data/flask_demo/cd /data/flask_demo/vim demo.py

内容如下:

import requests
from flask import Flask
from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span
import time

app = Flask(__name__)

app.config.update({
    "ZIPKIN_HOST":"127.0.0.1",
    "ZIPKIN_PORT":"9411",
    "APP_PORT":5000,
    # any other app config-y things
})


def do_stuff():
    time.sleep(2)
    headers = create_http_headers_for_new_span()
    requests.get('http://localhost:6000/service1/', headers=headers)
    return 'OK'


def http_transport(encoded_span):
    # encoding prefix explained in https://GitHub.com/Yelp/py_zipkin#transport
    #body = b"\x0c\x00\x00\x00\x01"+encoded_span
    body=encoded_span
    zipkin_url="http://127.0.0.1:9411/api/v1/spans"
    #zipkin_url = "http://{host}:{port}/api/v1/spans".fORMat(
     #   host=app.config["ZIPKIN_HOST"], port=app.config["ZIPKIN_PORT"])
    headers = {"Content-Type": "application/x-thrift"}

    # You'd probably want to wrap this in a try/except in case POSTing fails
    r=requests.post(zipkin_url, data=body, headers=headers)
    print(type(encoded_span))
    print(encoded_span)
    print(body)
    print(r)
    print(r.content)


@app.route('/')
def index():
    with zipkin_span(
        service_name='WEBapp',
        span_name='index',
        transport_handler=http_transport,
        port=5000,
        sample_rate=100, #0.05, # Value between 0.0 and 100.0
    ):
        with zipkin_span(service_name='webapp', span_name='do_stuff'):
            do_stuff()
        time.sleep(1)
    return 'OK', 200

if __name__=='__main__':
    app.run(host="0.0.0.0",port=5000,debug=True)

 

新建server1.py

from flask import request
import requests
from flask import Flask
from py_zipkin.zipkin import zipkin_span,ZipkinAttrs
import time
import pymysql

app = Flask(__name__)
app.config.update({
    "ZIPKIN_HOST":"127.0.0.1",
    "ZIPKIN_PORT":"9411",
    "APP_PORT":5000,
    # any other app config-y things
})


def do_stuff():
    time.sleep(2)
    with zipkin_span(service_name='service1', span_name='service1_db_search'):
        db_search()
    return 'OK'


def db_search():
    # 打开数据库连接
    db = pymysql.connect("127.0.0.1", "root", "123456", "mysql", charset='utf8')
    # 使用cursor()方法获取操作游标
    cursor = db.cursor()
    # 使用execute方法执行SQL语句
    cursor.execute("SELECT VERSION()")
    # 使用 fetchone() 方法获取一条数据
    data = cursor.fetchone()
    print("Database version : %s " % data)
    # 关闭数据库连接
    db.close()

def http_transport(encoded_span):
    # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
    #body = b"\x0c\x00\x00\x00\x01" + encoded_span
    body=encoded_span
    zipkin_url="http://127.0.0.1:9411/api/v1/spans"
    #zipkin_url = "http://{host}:{port}/api/v1/spans".format(
    #    host=app.config["ZIPKIN_HOST"], port=app.config["ZIPKIN_PORT"])
    headers = {"Content-Type": "application/x-thrift"}

    # You'd probably want to wrap this in a try/except in case POSTing fails
    requests.post(zipkin_url, data=body, headers=headers)


@app.route('/service1/')
def index():
    with zipkin_span(
        service_name='service1',
        zipkin_attrs=ZipkinAttrs(
            trace_id=request.headers['X-B3-TraceID'],
            span_id=request.headers['X-B3-SpanID'],
            parent_span_id=request.headers['X-B3-ParentSpanID'],
            flags=request.headers['X-B3-Flags'],
            is_sampled=request.headers['X-B3-Sampled'],
        ),
        span_name='index_service1',
        transport_handler=http_transport,
        port=6000,
        sample_rate=100, #0.05, # Value between 0.0 and 100.0
    ):
        with zipkin_span(service_name='service1', span_name='service1_do_stuff'):
            do_stuff()
    return 'OK', 200

if __name__=='__main__':
    app.run(host="0.0.0.0",port=6000,debug=True)

运行demo.py

python3 demo.py

 

运行server1.py

Python3 server1.py

 

访问5000端口

1.png

点击查证,点击下面的结果

1.png

 

 效果如下:

1.png

 

可以看到,有webapp和services两个service,5个span标签,可以清楚看到service和service,service和span,span和span之间的关系,和各span耗时情况。

 

点击依赖,效果如下:

1.png

 

点击webapp,效果如下:

 1.png

 

官网api文档:https://zipkin.io/zipkin-api/#/default/get_traces

 

这里演示一下,调用2个api

services

返回与span终结点关联的所有服务名称的列表。

 

http://192.168.31.232:9411/api/v2/services

 效果如下:

1.png

 

 

 

traces

 调用此请求将检索与以下筛选器匹配的跟踪。

 

 http://192.168.31.232:9411/api/v2/traces

效果如下:

1.png

 

 这里的tags,可以显示错误信息。

 

有错误时,就是红色的,点击红色区块

1.png

 

 

就可以看到具体信息

1.png

这个错误信息表示,无法连接到mysql。因为这台机器,还没有mysql服务。

 

为了消除这个错误,可以再启动一个mysql数据库。

mkdir -p /data/mysql
docker pull mysql:5.7

docker run -itd -p 3306:3306 --name wiki-mysql -e MYSQL_ROOT_PASSWord=123456 --restart=always --restart=on-failure:1 --oom-score-adj -1000 --privileged=true --log-opt max-size=10m --log-opt max-file=1 -v /data/mysql:/var/lib/mysql  mysql:5.7

 

重新启动server1.py

再次访问5000端口

1.png

再次查询一次,就没有红色了

1.png

 

如果需要做报警,可以通过调用api,获取到error信息,进行统一的邮件通知。

 

注意:zipkin的数据,默认是存在内存中的,如果重启服务,会造成数据丢失。 

在现有数据库基础上,新建实例,实例名为zipkin。

CREATE DATABASE zipkin DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

 

然后执行官网建库脚本

https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

 

执行sql之后,会建立3张表

 

这样我们的数据库就建好了。

 

执行

STORAGE_TYPE=mysql MYSQL_USER=root MYSQL_PASS=123456 MYSQL_HOST=127.0.0.1 MYSQL_tcp_PORT=3306 java -jar zipkin-server-2.12.9-exec.jar

这样启动zipkin,就自动连上mysql,并存储数据了。

如图,大功告成

1.png

 

 

注意,一般我们都在后台运行zipkin,所以用nohup的方式启动,命令如下

STORAGE_TYPE=mysql MYSQL_USER=root MYSQL_PASS=123456 MYSQL_HOST=127.0.0.1 MYSQL_TCP_PORT=3306 nohup java -jar zipkin-server-2.12.9-exec.jar &

 

 

本文参考链接:

https://www.cnblogs.com/shijingjing07/p/9340131.html

https://www.cnblogs.com/tseng-iOS/p/8005889.html


--结束END--

本文标题: zipkin微服务调用链分析(python)

本文链接: https://www.lsjlt.com/news/193650.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • zipkin微服务调用链分析(python)
    zipkin的作用在微服务架构下,一个http请求从发出到响应,中间可能经过了N多服务的调用,或者N多逻辑操作,如何监控某个服务,或者某个逻辑操作的执行情况,对分析耗时操作,性能瓶颈具有很大价值,zipkin帮助我们实现了这一监控功能。&n...
    99+
    2023-01-31
    zipkin python
  • 微服务链路追踪SpringCloudSleuth整合Zipkin解析
    目录前言何为调用链路Zipkin + SleuthZipkinSpring Cloud SleuthZipkin启动引入jar服务调用测试总结前言 如果在开发过程中,你还在靠查看服...
    99+
    2023-02-13
    Spring Cloud Sleuth整合Zipkin 微服务链路追踪
  • 分布式微服务系统下调用链追踪技术实例分析
    这篇文章主要介绍“分布式微服务系统下调用链追踪技术实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“分布式微服务系统下调用链追踪技术实例分析”文章能帮助大家解决问题。1、面试官:分布式微服务环境...
    99+
    2023-06-29
  • 分析Promise链式调用
    本篇内容介绍了“分析Promise链式调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言上一节中,...
    99+
    2024-04-02
  • python链式函数调用的示例分析
    小编给大家分享一下python链式函数调用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!链式函数调用你可以在一行代码内调用多个函数。def a...
    99+
    2023-06-27
  • 服务拆分和远程调用(微服务)
    博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会...
    99+
    2023-09-23
    微服务 java spring cloud spring
  • arthas jprofiler做复杂链路的调用分析
    目录背景1. arthas采样生成jfr文件2. 下载jfr到本地3. jprofiler分析3.1 打开快照3.2 反向分析3.3 分析结果总结背景 Arthas是阿里巴巴开源的应...
    99+
    2024-04-02
  • skywalking分布式服务调用链路追踪APM应用监控的示例分析
    这篇文章给大家分享的是有关skywalking分布式服务调用链路追踪APM应用监控的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言当企业应用进入分布式微服务时代,应用服务依赖会越来越多,skywalk...
    99+
    2023-06-29
  • Java 实现分布式服务的调用链跟踪
    目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后看结果和原理测试一下结果:为什么要实现调用...
    99+
    2024-04-02
  • Skywalking微服务监控分析
    转载本文需注明出处:微信公众号EAWorld,违者必究。引言:微服务框架落地后,分布式部署架构带来的问题就会迅速凸显出来。服务之间的相互调用过程中,如果业务出现错误或者异常,如何快速定位问题?如何跟踪业务调用链路?如何分析解决业务瓶颈?.....
    99+
    2023-06-05
  • Javasript设计模式之链式调用的示例分析
    这篇文章将为大家详细讲解有关Javasript设计模式之链式调用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下写过jquery的可能都知道,jque...
    99+
    2024-04-02
  • 详解OpenFeign服务调用(微服务)
    目录OpenFeign服务调用OpenFeign是什么Feign能干什么Feign集成了RibbonFeign和OpenFeign两者区别OpenFeign服务调用OpenFeign...
    99+
    2024-04-02
  • SpringCloud微服务的示例分析
    这篇文章给大家分享的是有关SpringCloud微服务的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Maven规范所有项目必须要有一个统一的parent模块所有微服务工程都依赖这个parent,pare...
    99+
    2023-06-20
  • skywalking分布式服务调用链路追踪APM应用监控
    目录前言skywalking是什么,有什么用?skywalaking总体架构分为三部分如何快速开始?第一步:进入官方release地址第二步:配置需要监控的应用的agent探针系统使...
    99+
    2024-04-02
  • 使用 python 进行微信好友分析
    使用 python 进行微信好友分析 1. 使用到的库 ① wxpy:初始化微信机器人 ② openpyxl:保存微信好友数据为Excel表格 ③ pyecharts:生成可视化的地图 ④ wordcloud、matplotlib、jie...
    99+
    2023-01-31
    好友 python
  • Java微服务应用测试的示例分析
    小编给大家分享一下Java微服务应用测试的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! package com.jeanron.licensesservice.domain; public class Licen...
    99+
    2023-06-04
  • 微服务治理与统计分析
    转载本文需注明出处:微信公众号EAWorld,违者必究。引言:微服务架构下,服务拆得越细,服务的粒度越小,可组装性就越好;与之相对的服务之间的调用关系就会变复杂,为了保证服务更好的运行,需要对这些服务进行监控和管理。本文大家介绍下EOS微服...
    99+
    2023-06-05
  • Docker和微服务的示例分析
    这篇文章将为大家详细讲解有关Docker和微服务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SOA“简史”在2000年初,我们目睹了面向服务架构(Service Oriented Archit...
    99+
    2023-06-02
  • 亚马逊云服务器供应链分析
    硬件供应链:亚马逊云服务器的硬件供应链包括CPU、内存、存储、主板、硬盘、固态硬盘、操作系统、驱动程序、电源等。亚马逊会根据产品类型、规格、供应商、产能等因素来制定不同的供应链策略。 操作系统供应链:亚马逊云服务器的操作系统供应链包括Ku...
    99+
    2023-10-27
    亚马逊 供应链 服务器
  • Android 无障碍服务 performAction 调用过程分析
    目录View 的 performClick 方法是同步的还是异步的?总结无障碍服务可以模拟一些用户操作,无障碍可以处理的对象,通过类 AccessibilityNodeInfo 表示...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作