zipkin+elasticsearch+kibana链路监控

本文详细介绍了一种在Windows环境下模拟微服务系统链路追踪的方法,利用Zipkin、Elasticsearch和Kibana进行数据追踪、存储及可视化,涵盖了前期准备、快速启动步骤及常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 简介

2 前期准备

    2.1下载elasticsearch

    2.2下载kibana

    2.3下载zipkin server jar包(也可以新建springboot,自己搭建run)

3 快速开始

  3.1 开启elasticsearch

  3.2开启kibana

      3.2.1配置kibana

      3.2.2运行kibana

  3.3 开启zipkin 服务器

  3.4 开启bert服务端

  3.5 开启优衣库服务端

  3.6 买东西,催下单 链路访问模拟

  3.7 链路追踪

4 kibana设置权限问题:

  4.1 下载nginx

  4.2 开始:

      4.2.1配置

      4.2.2启动

5 zipkin框架解析:

6 其他问题:

6.1 不熟悉java 的话可以使用 python

6.2 上述源码

6.3 bert和优衣库代码打包的话请参考

6.4 eclipse 上传github

6.5 参考资料



 


1 简介

      微服务系统:在win下 模拟客户买东西即一个叫bert的客户访问优衣库买衣服的简单demo,使用zipkin来追踪链路,并将数据持久化到elasticsearch,最后通过kibana来搜 索、查看交互存储在Elasticsearch索引中的数据。

2 前期准备

    2.1下载elasticsearch

          镜像网站:https://mirrors.huaweicloud.com/elasticsearch/7.6.2/

    2.2下载kibana

          镜像网站:  https://mirrors.huaweicloud.com/kibana/7.6.2/

    2.3下载zipkin server jar包(也可以新建springboot,自己搭建run)

          比如zipkin-server-2.21.6-exec.jar,网上很多,都可以,这里提供一个

          链接:https://pan.baidu.com/s/1GIrDlg7AGQQnJ3i_4m9GdA
          提取码:0g47

3 快速开始

   3.1 开启elasticsearch

     运行./bin/elasticsearch.bat

     访问 http://localhost:9200/

  3.2开启kibana

      3.2.1配置kibana

             打开./config/kibana.yml,指定要绑定的elasticsearch源,同时可以配置一下中文

       

      3.2.2运行kibana

            运行./bin/kibana.bat

            访问http://localhost:5601/

   3.3 开启zipkin 服务器

java -jar zipkin-server-2.21.6-exec.jar --STORAGE_TYPE=elasticsearch --DES_HOSTS=http://localhost:9200

    访问http://localhost:9411

    3.4 开启bert服务端

这里打成了jar包,看源码可以在文末连接下载

java -jar bert.jar

访问 http://localhost:8988/bert_home

  3.5 开启优衣库服务端

这里打成了jar包,看源码可以在文末连接下载

java -jar UNIQLO.jar

访问 http://localhost:8989/UNIQLO_home

  3.6 买东西,催下单 链路访问模拟

浏览器分别访问

http://localhost:8988/shopping 

http://localhost:8989//place_client_order

会看到

   3.7 链路追踪

查看zipkin web  http://localhost:9411

会发现

 

查看kibana

 

4 kibana设置权限问题:

kibana 本身没有用户名密码的设置,可以使用 nginx 来实现。

  4.1 下载nginx

           https://www.cnblogs.com/jiangwangxiang/p/8481661.html

  4.2 开始:

   参考: https://blog.youkuaiyun.com/li916227164/article/details/93883408

      4.2.1配置

特别注意:有的时候改了配置,可是无法生效,一直是欢迎界面,那么有可能是浏览器缓存导致的,清一下就可以看到了,如下配置

即可登录访问本地目录,如果是访问kibana即http://localhost:5601

那么就得不能用root了,要用代理即

auth_basic_user_file就是账号,密码目录,可以使用htpasswd在线生成器进行加密成暗文:

https://tool.oschina.net/htpasswd

当然也可以是一个简单的txt文件格式是:

ytt:123456

      4.2.2启动

先启动kibana等服务,然后启动nginx,访问:

http://localhost/

可看到

linux 下可以参考:

https://www.cnblogs.com/agang-php/p/11167397.html

5 zipkin框架解析:

大体框架如下

(1) 其中CLIENT到collector 是日志收集部分,后续我们称为过程a

(2) collector到storage是数据上传保存部分,后续我们称为过程b

(3) zipkin 通过API从数据库中读取数据,然后可视化到ui界面,后续我们称为过程c

其中如果想各个部分分开做:

-----------------------------------------------------------------------------------------

那么过程a可以采用SpringCloud-Sleuth来收集日志,保存到本地

----------------------------------------------------------------------------------------

过程b就是将日志保存起来,假设还是保存到es,那么其实就是看看上述zipkin 在es保存的数据格式,然后我们只需要同样按该格式(其实就是哪些字段)保存好就行,看其字段有几种方式,可以通过kibana看一条记录就可以如:

接下来思路就是按照这种格式同样保存到es就行,往数据库中写数据手段多多,因为比较熟悉python这里就用python吧

关于使用Python对es进行增查删改,博客很多,可以查查,这里主要说一说探究过程和其中遇到的一些问题,帮助快速熟悉。

整个思路就是:

由于当前我们es已经保存了部分数据(上述运行bert的数据),这部分数据肯定是合法的,我们第一步就是该一下其中某些字段的值,看看ui中是否也对应更新显示,如果是,那么接下来就按照这部分的数据格式往其中插入一条新的数据,看看ui是否显示,显示即完成目标!所以

第一步:更新合法数据部分字段,验证es和ui实时同步更新。

第二步:往es插入一条新数据,看ui是否正确显示。

 

首先我们获取一条数据

import json
from elasticsearch import Elasticsearch
es = Elasticsearch()

print(es.get(index='zipkin-span-2020-08-17',id='3784d590c377d16d-dd53762eed5608551f14c1435038c9fe'))

输出

注意点:

(1) index 对应的就是下面的红框,id按说是对应绿框,但是其实kibana这里显示id是切断的简洁版,可以看其json文件,那里有其完整的id,更长的完整版,只有使用这个完整版,es.get才会找到,否则不行

接下来我们更新部分一个字段

index = 'zipkin-span-2020-08-17'
_id = "3784d590c377d16d-dd53762eed5608551f14c1435038c9fe"

es.update(index=index,id=_id ,body={'doc':{'name': "please successfully"}})

即这里将name更新为"please successfully",那么我们看es和对应ui

可以看到对应都变了,所以具有可行性

注意点:

(1)更新的时候一定要指定index和id

  (2) body这里是固定写法即

body={'doc':{要更新的字段}}

切不可写成

body={要更新的字段}

后面这种在之前的版本可能对,当前是要使用上面的这种形式

 

接下来就是要插入一条数据了,有哪些字段呢?再看这个

我们只需要填填充如下字段即可

_index
_type
_id
_source

其他的version什么的我们不要管,当我们新插入一条数据的时候,这些会帮自动弄的

index:就是一个索引名字,随便取取

type:统一取成 '_doc'就行

id :这个就是一个唯一标识,也是自己随便定义,保证唯一即可,需要注意的是,在插入数据的时候有两种方法,即是index和create,其中Index方式可以不加这个字段,系统会为我们自动创建一个全局唯一id(我猜是根据时间戳),create是必须自己要定义一个,所以后续我们用index这种方式,懒得生成id了

source 这部分最重要了,其实这里就是个大字典,里面定义了所有我们路由监控到的数据,trainceId,paerntId等等

好了插入一条看看:

#字典定义
index = "zipkin-span-2020-10-18"
doc_type = "_doc"
traceId = '5555555555555555'
duration = 1234567
shared = True
localEndpoint = {'serviceName': 'uniqlo', 'ipv4': '192.168.0.102', 'port': 8989}
timestamp_millis = 1597668254890
kind = 'SERVER'
name = "tt"
#parentId = "3784d590c377d16d"
timestamp = 1597668254890000
_id = "3784d590c377d16d"
tags = {'mvc.controller.class': 'ZipkinProviderApplication', 'mvc.controller.method': 'call_bert_home', 'spring.instance_id': 'windows10.microdone.cn:UNIQLO:8989'}

#插入一条数据
es.index(index=index,doc_type=doc_type,body={"traceId":traceId,"duration":duration,'shared':shared,"localEndpoint":localEndpoint,"timestamp_millis":timestamp_millis,
                                            "kind":kind,'name':name,"timestamp":timestamp,"id":_id,'tags':tags})

看看es和UI

注意点

(1)因为这里没有链路访问,所以没有parentId,后续有的话可以加上,有真正数据后也可以关联起来

总体代码

# -*- coding: utf-8 -*-
from elasticsearch import Elasticsearch

es = Elasticsearch()


#查看一条样本
print(es.get(index='zipkin-span-2020-08-17',id='3784d590c377d16d-dd53762eed5608551f14c1435038c9fe'))

#更新一条样本
index = 'zipkin-span-2020-08-17'
_id = "3784d590c377d16d-dd53762eed5608551f14c1435038c9fe"
es.update(index=index,id=_id ,body={'doc':{'name': "please successfully"}})


#插入一条样本

#字典定义
index = "zipkin-span-2020-10-18"
doc_type = "_doc"
traceId = '5555555555555555'
duration = 1234567
shared = True
localEndpoint = {'serviceName': 'uniqlo', 'ipv4': '192.168.0.102', 'port': 8989}
timestamp_millis = 1597668254890
kind = 'SERVER'
name = "tt"
#parentId = "3784d590c377d16d"
timestamp = 1597668254890000
_id = "3784d590c377d16d"
tags = {'mvc.controller.class': 'ZipkinProviderApplication', 'mvc.controller.method': 'call_bert_home', 'spring.instance_id': 'windows10.microdone.cn:UNIQLO:8989'}
es.index(index=index,doc_type=doc_type,body={"traceId":traceId,"duration":duration,'shared':shared,"localEndpoint":localEndpoint,"timestamp_millis":timestamp_millis,
                                            "kind":kind,'name':name,"timestamp":timestamp,"id":_id,'tags':tags})

--------------------------------------------------------------------------------------------------------------------------------------------------

 

过程C的话就是需要将参数传给ui对应 的url就行了,有哪些地址了可以看其官方:

https://zipkin.io/zipkin-api/

关于怎么传这里说的比较清楚

https://www.jianshu.com/p/17ce989e108e

这里写了个jdk11版本的,已上传github

 

6 其他问题:

6.1 不熟悉java 的话可以使用 python

https://www.cnpython.com/pypi/py-zipkin

https://blog.youkuaiyun.com/weixin_34255055/article/details/86278842

6.2 上述源码

https://github.com/Mryangkaitong/zipkin-elasticsearch-kibana

6.3 bert和优衣库代码打包的话请参考

https://blog.youkuaiyun.com/Garnett_zk/article/details/89185978

主要就是在pom文件中加

<packaging>jar</packaging>

打包成功后会在程序目录下的target目录下生产相应的jar包

如果报错 程序包org.junit.jupiter.api不存在请看

https://blog.youkuaiyun.com/littlehaes/article/details/104088317

6.4 eclipse 上传github

https://blog.youkuaiyun.com/weixin_34128839/article/details/92169706

https://jingyan.baidu.com/article/27fa7326b694d846f8271fd3.html

https://blog.youkuaiyun.com/qq_41973729/article/details/82184034

6.5 参考资料

(1) https://www.bilibili.com/video/BV1p4411K7pz?p=3

(2) https://blog.youkuaiyun.com/qq_41112063/article/details/106056627?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.channel_param

(3) https://blog.youkuaiyun.com/forezp/article/details/70162074

(4) https://blog.youkuaiyun.com/weixin_38937840/article/details/103891093

(5) https://blog.youkuaiyun.com/qq_38187437/article/details/105171275

(6) https://www.cnblogs.com/liuqijia/p/11507494.html

(7) https://www.jianshu.com/p/17ce989e108e

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值