kubernetes 微服务链路监控-Pinpoint

1 全链路监控概念

1.1 全链路监控是什么 

随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求 往往需要涉及到多个服务。这些服务可能不同编程语言开发,不同 团队开发,可能部署很多副本。因此,就需要一些可以帮助理解系 统行为、用于分析性能问题的工具,以便发生故障的时候,能够快 速定位和解决问题。全链路监控组件就在这样的问题背景下产生了。 全链路性能监控 从整体维度到局部维度展示各项指标,将跨应用的 所有调用链性能信息集中展现,可方便度量整体和局部性能,并且 方便找到故障产生的源头,生产上可极大缩短故障排除时间。

1.2 全链路监控解决什么问题

请求链路追踪:通过分析服务调用关系,绘制运行时拓扑信息,可视化展示
调用情况衡量:各个调用环节的性能分析,例如吞吐量、响应时间、错误次数
容器规划参考:扩容/缩容、服务降级、流量控制
运行情兄反馈:告警,通过调用结合业务日志快速定位错误信息

1.3 全链路监控选择依据

全链路监控系统有很多,应从这几方面选择:
·探针的性能消耗

APM组件服务的影晌应该做到足够小,数据分析要快,性能占用小。

·代码的侵入性

也作为业务组件,应当尽可能少入侵或者无入侵其他业务系统,对于使用方透明,减少开发人员的负担。

·监控维度

分析的维度尽可能多。

·可扩展性

一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性。能够支持的組件越多当然好。

主流系统:zipkin、 skywalking、 pinpoint

1.4 pinpoint链路监控组件的介绍

Pinpoint是一个APM(应用程序性能管理)工具,适用于用Java/PHP编写的大型分布式系统。

特性:

    服务器地图(ServerMap)通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。
    实时活动线程图 (Realtime Active Thread Chart) :实时监控应用内部的活动线程。
    请求/响应分布图( Request/Response Scatter Chart ) :长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看 更多的详细信息。
    调用栈( CallStack ):在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。
    检查器( Inspector ) :查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。

1.5 pinpoint架构

pinpoint agent会部署在程序服务器上,程序启动时会指定agent服务,由pinpoint collector获取微服务之间的链路监控,然后存储在Hbase数据库中,pinpoint web ui展示监控数据。 kubernetes 微服务链路监控-Pinpoint

2 Pinpoint服务端部署

pinpoint对资源要求还是挺高的,部署的时候得合理安排资源.
git clone https://github.com/naver/pinpoint-docker.git
cd pinpoint-docker
docker-compose pull
docker-compose up -d

 docker-compose ps

浏览器访问
pinpoint-web容器提供页面展示,已经将容器的8080端口映射成了8039端口,直接访问8079端口即可。
kubernetes 微服务链路监控-Pinpoint

3 pinpoint agent部署

Tomcat方式接入pinpoint-agent方式
需要修改bin/catalina.sh脚本
CATALINA_OPTS="$CATALINA_OPTS -javaagent:"$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId="$AGENT_ID"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName="$APPLICATION_NAME"

java -jar启动程序的方式如下
直接在启动命令中增加即可
java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=$AGENT_ID
-Dpinpoint.applicationName=$APPLICATION_NAME xxx.jar

-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar          #agent程序的的jar包
-Dpinpoint.agentId=$AGENT_ID                    #程序计入pinpoint的一个id号,每个微服务副本节点都要求唯一
-Dpinpoint.applicationName=$APPLICATION_NAME                #应用组名,一个相同的微服务他们的应用组名要保持一样

3.1 配置pinpoint-agent

1.下载pinpoint-agent
[root@binary-k8s-master1 ~]# wget https://github.com/pinpoint-apm/pinpoint/releases/download/1.8.3/pinpoint-agent-1.8.3.tar.gz

2.配置pinpoint
[root@binary-k8s-master1 ~]# vim pinpoint-agent/pinpoint.config 
profiler.collector.ip=192.168.10.21             #指定pinpoint collector组件的IP地址

3.将pinpoint拷贝到每个微服务的代码目录中
[root@binary-k8s-master1 ~]# cp -rp pinpoint-agent springcloud/simple-microservice-dev1/{eureka-service,gateway-service,portal-service}
[root@binary-k8s-master1 ~]# cp -rp pinpoint-agent springcloud/simple-microservice-dev1/product-service/product-service-biz/
[root@binary-k8s-master1 ~]# cp -rp pinp springcloud/simple-microservice-dev1/stock-service/stock-service-biz/
[root@binary-k8s-master1 ~]# cp -rp pinpoint-agent springcloud/simple-microservice-dev1/stock-service/stock-service-biz/

3.2 修改每个微服务程序的Dockerfile接入pinpoint-agent

修改每个微服务程序的Dockerfile,将pinpoint的程序目录拷贝到容器中,然后在程序的启动命令中加上pinpoint-agent参数,接入pinpoint,其中-Dpinpoint.agentId字段的值采用pod的名称来定义,Dpinpoint.applicationName字段的值采用simple-服务名称来定义。

3.2.1 eureke-service服务

[root@k8s-master01 simple-microservice_dev4]# cat eureka-service/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/eureka-service.jar ./
COPY pinpoint /pinpoint
EXPOSE 8888
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=${HOSTNAME} -Dpinpoint.applicationName=ms-eureka -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar

3.2.2 gateway-service服务

[root@k8s-master01 simple-microservice_dev4]# cat gateway-service/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/gateway-service.jar ./
COPY pinpoint /pinpoint
EXPOSE 9999
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=$(echo $HOSTNAME | awk -F- '{print "gateway-"$NF}') -Dpinpoint.applicationName=ms-gateway /gateway-service.jar

3.2.3 order-service服务

[root@k8s-master01 simple-microservice_dev4]# cat order-service/order-service-biz/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/order-service-biz.jar ./
COPY pinpoint /pinpoint
EXPOSE 8020
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=$(echo $HOSTNAME | awk -F- '{print "order-"$NF}') -Dpinpoint.applicationName=ms-order /order-service-biz.jar

3.2.4 portal-service服务

[root@k8s-master01 simple-microservice_dev4]# cat portal-service/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/portal-service.jar ./
COPY pinpoint /pinpoint
EXPOSE 8080
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=$(echo $HOSTNAME | awk -F- '{print "portal-"$NF}') -Dpinpoint.applicationName=ms-portal /portal-service.jar

3.2.5 product-service服务

[root@k8s-master01 simple-microservice_dev4]# cat product-service/product-service-biz/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/product-service-biz.jar ./
COPY pinpoint /pinpoint
EXPOSE 8010
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=$(echo $HOSTNAME | awk -F- '{print "product-"$NF}') -Dpinpoint.applicationName=ms-product /product-service-biz.jar

3.2.6 stock-service服务

[root@k8s-master01 simple-microservice_dev4]# cat stock-service/stock-service-biz/Dockerfile 
FROM lizhenliang/java:8-jdk-alpine
LABEL maintainer www.ctnrs.com
COPY ./target/stock-service-biz.jar ./
COPY pinpoint /pinpoint
EXPOSE 8030
CMD java -jar -javaagent:/pinpoint/pinpoint-bootstrap-1.8.3.jar -Dpinpoint.agentId=$(echo $HOSTNAME | awk -F- '{print "stock-"$NF}') -Dpinpoint.applicationName=ms-stock /stock-service-biz.jar

3.3 将所有的微服务接入到pinpoint系统

Dockerfile已经调整好,只需要执行咱们写好的部署脚本,将所有的微服务根据最新的Dockerfile制作出最新的镜像,然后在K8S集群中重新部署一下即可。
[root@k8s-master01 k8s]# bash docker_build.sh 

浏览器访问查看pinpoint
kubernetes 微服务链路监控-Pinpoint

查看product链路追踪情况如下图
可以在链路监控视图中看到服务之间调用请求的次数,以及是如何调用的。

kubernetes 微服务链路监控-Pinpoint

点击右侧最上面的统计图,然后找到图中的小点,选中这个小点就会跳转到代码调用的页面

kubernetes 微服务链路监控-Pinpoint

选中完之后会立即跳转,然后点击该请求
请求成功的监控内容

kubernetes 微服务链路监控-Pinpoint

点击mixed view会看到更加丰富的展示视图

kubernetes 微服务链路监控-Pinpoint

查看微服务的JVM监控信息
点击inspector

kubernetes 微服务链路监控-Pinpoint

4 监控java应该监控的指标

监控java 应用哪些指标
1、堆内存:年轻代、老年代、非堆内存(持久代)
2、线程数量
3、GCC(垃圾回收),G1,CMS
4、CPU利用率
5、堆栈跟踪
6、接口状态
7、吞吐量
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: