【skywalking 部署测试】

提示:学习记录

skywalking 部署测试

  • 概述
  • 一、skywalking 基础测试
    • 1. 基于 docker-compose 或二进制部署 SkyWalkingMarkdown
    • 2. 实现单体服务 Halo 博客和 Jenkins 的请求链路跟踪
      • skywalking web界面介绍
      • Apdex简介:
    • 3. 实现 Dubbo 微服务实现链路跟踪案例
      • 1. 创建新服务器安装zookeeper,服务端以及JavaAgent,安装jdk8
      • 2. 部署客户端,安装JDK,JavaAgent以及配置ZK
      • 3. 部署dubboadmin,通过dubboadmin查看微服务注册与消费记录
    • 4. 实现 skywalking 的钉钉告警
  • 二、扩展
    • 1. 实现 Python Django 项目的请求链路跟踪
    • 2. 实现 OpenResty(nginx) 及后端 Java 服务的全链路请求链路跟踪


概述

APM概述:
早期监控工具功能比较单一,主要以监控CPU使用率、I/O、内存资源、网速等网络基础设施为主(cacti、nagios)
后来随着中间件技术的不断发展,APM也开始监控缓存、数据库、MQ等各种基础组件的性能(zabbix、prometheus)
微服务兴起之后,系统功能被模块化,再加上k8s与容器化的兴起及应用数量的爆炸式增长,各模块和服务之的调用链路、响应时间、负载等越来越不好通过传统的工具进行监控和统计,此时APM系统诞生了(应运而生)。

  • APM核心功能:
    收集应用程序的性能:APM系统的核心作用是收集并展示应用程序接收请求和构建响应的性能,从而掌握整条链路的途径和性能,通过APM可以帮助运维人员快速统计出应用程序中访问量最多的URL、响应最慢的URL以及应用程序需要优化的URL等。
  1. 监控应用程序调用的中间件的性能(依赖调用):应用程序也可能由于其依赖的中间件或者其它的API的性能有问题、例如被调用的数据库、缓存、Web 服务器、第三方服务等响应慢而导致应用程序变慢,因此不仅要监控应用程序自身,还要监控其所有的外部依赖项。

  2. 在代码级别实现性能分析:通过在代码级别分析应用程序中的class等,APM工具可以深入了解并分析导致应用程序性能较低的代码,另外目前安卓、IOS等手机APP都有Agent用于记录APP的启动时间、首屏加载时间、使用的网络类型、版本信息、崩溃记录等信息并提交到服务端进行统计分析和展示。

  3. 监控应用程序资源使用情况:监控资源使用情况尤其是CPU和内存的使用情况至关重要(如java程序的内存使用等),尤其是想根据资源利用率实现自动弹性伸缩应用程序。

  4. 统一展示监控数据和日志:应用程序的性能统计、访问和错误日志在统一的平台进行展示(devops运维平台),方便快速查询与故障定位

- APM项目

  1. CAT: 由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT需要开发人员手动在应用程序中埋点,对代码侵入性比较强。

  2. Zipkin: 由Twitter公司开发并开源,基于Java语言实现,侵入性相对于CAT要低一点,需要对web.xml等相关配置文件进行修改,但依然对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成,也是Spring Cloud推荐的APM系统。

  3. jaeger 是Uber推出的一款开源分布式追踪系统,主要使用go语言开发,对业务代码侵入性较少。

  4. Pinpoint: 韩国团队开源的APM产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现APM功能,对代码无侵入,目前支持Java和 PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多。

  5. SkyWalking: Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目,2017年12月SkyWalking成为Apache国内首个个人孵化项目,2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前SkyWalking支持Java、.Net、Node.js、go、python等探针,数据存储支持MySQL、ElasticSearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗,但性能表现优秀,目前SkyWalking增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是 SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC 等等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking。

  6. 开源:piwik等 #http://blogs.studylinux.net/?p=750

  7. 商业的:百度统计/growingio等

skywalking 基于谷歌的dapper设计理念

  • 设计要求
    i. 无处不在的部署: 任务服务都i应该被监控到
    ii. 持续的监控: 7*24
  • 设计目标
    i. 低消耗,对服务影响最小,CPU、内存尽可能低
    ii. 对应用透明,不用植入代码
    iii. 可伸缩性:针对未来众多的服务和大规模业务集群
  • 请求链路
    i. 为每次请求添加跟踪标识符(timestamped events)
    ii. 基于dapper或类似的跟踪系统,跟踪客户额完整请求

todo: Apm系统对比

一、skywalking 基础测试

注:测试虚拟机系统都是Ubuntu20.04LTS

1. 基于 docker-compose 或二进制部署 SkyWalkingMarkdown

  1. skywalking 组件1
    Alt
  1. skywalking支持elasticsearch作为数据库存储,这里测试使用elasticsearch作数据存储,先部署好elasticsearch

简化安装elasticsearch,关闭SSL校验,单机部署。通过deb安装上传elasticearch的deb安装包

dpkg -i elasticsearch-8.5.2-amd64.deb

【skywalking 部署测试】_第1张图片

修改elasticsearch配置文件

grep -v '#' /etc/elasticsearch/elasticsearch.yml | grep -v '^$'
cluster.name: my-application
node.name: db-node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.182.62
http.port: 9200
discovery.seed_hosts: ["192.168.182.62"]
cluster.initial_master_nodes: ["192.168.182.62"]
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
http.host: 0.0.0.0

启动服务查看服务状态 【skywalking 部署测试】_第2张图片
通过插件链接查看链接成功,由于没有配置认证,直接链接成功
【skywalking 部署测试】_第3张图片

  1. 部署好elasticsearch,接下来可以安装skywalking,先获取skywalking安装包
    https://skywalking.apache.org/downloads/

skywalking官网下载链接地址

  1. skywalking依赖jdk,当前版本需要安装jdk11
apt update && apt install openjdk-11-jdk -y

在这里插入图片描述

  1. 上传二进制包并解压到/apps 路径下,并创建软连接
root@skywalking-server:/apps# tar xvf apache-skywalking-apm-9.3.0.tar.gz
ln -sv /apps/apache-skywalking-apm-bin/ /apps/skywalking

【skywalking 部署测试】_第4张图片

  1. 修改skywalking配置文件,主要是配置storage为elasticsearch(默认为h2,仅用于测试)
vim /apps/skywalking/config/application.yml
storage:
  selector: ${SW_STORAGE:elasticsearch}

【skywalking 部署测试】_第5张图片

  1. 创建skywalking.service文件
vim /etc/systemd/system/skywalking.service
[Unit]
Description=Apache Skywalking
After=network.target
[Service]
Type=oneshot
User=root
WorkingDirectory=/apps/skywalking/bin/
ExecStart=/bin/bash /apps/skywalking/bin/startup.sh
RemainAfterExit=yes
RestartSec=5
[Install]
WantedBy=multi-user.target
# 启动服务
systemctl daemon-reload && systemctl restart skywalking.service && systemctl enable skywalking.service

【skywalking 部署测试】_第6张图片

  1. 前端测试访问

skywalking端口
8080–UI端口 。12800–http端口(用于接收agent发送的http请求)。11800–gRPC端口(用于接收gRPC客户端发发送的数据)
前端访问空白,F12查看有接口报错500,遂取查看服务日志:
【skywalking 部署测试】_第7张图片

【skywalking 部署测试】_第8张图片

查看12800并没有被监听,排除elasticsearch服务正常,于是重启skywalking服务,重启后恢复正常
【skywalking 部署测试】_第9张图片


2. 实现单体服务 Halo 博客和 Jenkins 的请求链路跟踪

  1. 安装skywalking-javaagent
    官网获取安装包:https://skywalking.apache.org/downloads/
    【skywalking 部署测试】_第10张图片
    java-agent下载链接
  2. 下载好后的java-agent直接放到/data 路径下,和/apps路径服务区分开,修改配置文件
/data/skywalking-agent/config/agent.config
agent.service_name=${SW_AGENT_NAME:Halo-agent}
agent.namespace=${SW_AGENT_NAMESPACE:Halo1}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.182.61:11800}
  1. 获取halo的jar包,同样放在/apps路径下
    halo1.6.1 github下载地址
  2. 安装jdk11(halo1.6.1 依赖jdk11)
apt update && apt install openjdk-11-jdk -y
  1. 启动测试,使用skywakingagnet 配合起订halo
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/halo-1.6.1.jar
# 生产环境启动命令参考
java -javaagent:/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAMESPACE=xyz \
-DSW_AGENT_NAME=abc-application \
-Dskywalking.collector.backend_service=skywalking.abc.xyz.com:11800 \
-jar abc-xyz-1.0-SNAPSHOT.jar

【skywalking 部署测试】_第11张图片
截图显示启动成功

  • 首次访问根据提示进行安装
    【skywalking 部署测试】_第12张图片
    admin/admin123
    发布测试博客
    【skywalking 部署测试】_第13张图片
  1. 通过skywalkingUI查看服务监控
    【skywalking 部署测试】_第14张图片
    查看拓扑图
    【skywalking 部署测试】_第15张图片

  1. 通过tomcat启动jenkins(用来区别上面直接使用java启动的方式)
    下载tomcat,下载地址tomcat8.5.84
  • 将下载的tomcat上传并解压到/apps 路径下
  • 将jenkins.war上传到 /apps/apache-tomcat/webapps 路径(该路径其他文件删除)
    【skywalking 部署测试】_第16张图片
  • 修改tomcat启动文件
vim /apps/apache-tomcat/bin/catalina.sh
# 加入启动命令参数
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/skywalking-agent/skywalking-agent.jar -Dskywalking.collector.backend_service=192.168.182.61:11800 -Dskywalking.agent.service_name=Jenkins -Dskywalking.agent.namespace=Jenkins-namespace"; export CATALINA_OPTS

【skywalking 部署测试】_第17张图片

  • http://192.168.182.63:8080/jenkins
    【skywalking 部署测试】_第18张图片
  • skywalking UI查看
    【skywalking 部署测试】_第19张图片

skywalking web界面介绍

  1. 普通服务-服务
  • service:服务列表,服务svc表示对请求提供相同行为的一系列或一组工作负载,在使用agent或者SDK的时候,可以自定义服务的名字,如果不定义,skywalking将会使用你在平台上定义的名字
    load(cals/min): 每分钟访问次数;success Rate(%):成功率;latency(ms):延迟时间;apdex:应用性能指数
  • topology:拓扑图
  • log:日志
    Service Apdex(数字):当前服务的评分
    Successful Rate(数字):请求成功率
    Service Load (calls / min) 数字: 分钟请求数
    Service Avg Response Times(ms):平均响应延时,单位ms
    Service Apdex(折线图):一段时间内Apdex评分
    Service Response Time Percentile (ms)折线图:服务响应时间百分比
    Service Load (calls / min) 折线图: 分钟请求数
    Success Rate (%)折线图:分钟请求成功百分比
    Message Queue Consuming Count(折线图):消息队列消耗计数
    Message Queue Avg Consuming Latency (ms)折线图:消息队列平均消耗延迟(毫秒)
    Service Instances Load (calls / min):节点请求次数
    Slow Service Instance (ms):每个服务实例(物理机、云主机、pod)的最大延时
    Service Instance Success Rate (%):每个服务实例的请求成功率
    Endpoint Load in Current Service (calls / min):每个端点(URL)的请求次数
    Slow Endpoints in Current Service (ms):当前端点(URL)的最慢响应时间
    Success Rate in Current Service (%):当前服务成功率(%)

Apdex简介:

  • Apdex全称是(Application Performance Index,应用性能指数),是由Apdex联盟开放的用于评估应用性能的标准,Apdex 联盟起源于2004年,Apdex标准从用户的角度出发,提供了一个统一的测量和报告用户体验的方法,将其量化为范围为0-1的满意度评价,把最终用户的体验和应用性能作为一个完整的指标进行统一度量.  在网络中运行的任何一个应用(Web服务),它的响应时间决定了用户的满意程度,用户等待所有交互完成时间的长短直接影响了用户对应用的满意程度,这才是对用户有真正意义的“响应时间”,Apdex把完成这样一个任务所用的时间长短称为应用的“响应性”。
  • Apdex 定义了应用响应时间的最优门槛为T,另外根据应用响应时间结合T定义了三种不同的性能表现:
  • Satisfied(满意)-应用响应时间小于或等于Apdex阈值,比如Apdex阈值为1s,则一个耗时0.6s或者1s的响应结果则可以认为是满意的。
  • Tolerating(可容忍)-应用响应时间大于Apdex阈值,但同时小于或等于4倍的Apdex阈值,假设应用设定的Apdex阈值为1s,则4*1=4s为应用响应时间的容忍上限。
  • Frustrated(烦躁期)-应用响应时间大于4倍的Apdex阈值。

3. 实现 Dubbo 微服务实现链路跟踪案例

微服务发现需要借助注册中心,常用zookeeper,类似K8S中的svc
本实验需要有服务端和客户端,服务端创建新的虚拟机,安装zk以及服务端,客户端安装在elasticsearch服务器上
不论服务端还是客户端,都需要安装skywalking javaagent
此次测试用的服务端和客户端都依赖jdk8

1. 创建新服务器安装zookeeper,服务端以及JavaAgent,安装jdk8

  • 安装jdk
apt update && apt install openjdk-8-jdk -y
  • 获取zk软件包
    参考zookeeper安装指导
    下载最新的长期稳定版:https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
    解压到/apps路径下,修改配置并启动zk服务测试
cp /apps/apache-zookeeper-3.7.1-bin/conf/zoo_sample.cfg /apps/apache-zookeeper-3.7.1-bin/conf/zoo.cfg
/apps/apache-zookeeper-3.7.1-bin/bin/zkServer.sh start
# 查看端口是否起来
lsof -i:2181

【skywalking 部署测试】_第20张图片

  • 安装javaAget
    解压agent软件包到/data路径下,用来和/apps区分,修改配置文件,主要是配置服务名称、命苦空间以及sk服务地址
root@unbntu-sev-2:/data# grep -e collector.backend_service -e agent.namespace -e agent.service_name /data/skywalking-agent/config/agent.config | grep -v '#'
agent.service_name=${SW_AGENT_NAME:dubbo-server1}
agent.namespace=${SW_AGENT_NAMESPACE:dubbo}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:skywalking.example.com:11800}
# 配置本机hosts配置,识别域名解析
echo "192.168.182.61 skywalking.example.com" >> /etc/hosts
  • 上传测试用服务端jar包,通过tomcat启动服务,本jar依赖从环境变量读取zk地址,环境变量配置zk地址
mkdir -p /apps/dubbo/provider
/apps/dubbo/provider/dubbo-server.jar
# 配置环境变量zk地址
vim /etc/profile
export ZK_SERVER1=192.168.182.64
# 使配置生效
source /etc/profile
# 验证配置
root@unbntu-sev-2:/apps# echo $ZK_SERVER1

【skywalking 部署测试】_第21张图片

  • 启动服务
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/dubbo/provider/dubbo-server.jar

【skywalking 部署测试】_第22张图片

2. 部署客户端,安装JDK,JavaAgent以及配置ZK

  • 安装jdk以及上传客户端jar包到自定义路径,dubbo-clinet.jar依赖从环境变量获取ZK地址
apt update && apt install openjdk-8-jdk -y
# 客户端上传至路径如下
/apps/dubbo/consumer/dubbo-client.jar
# 环境变量增加ZK配置
# 配置环境变量zk地址
vim /etc/profile
export ZK_SERVER1=192.168.182.64
# 使配置生效
source /etc/profile
  • 安装JavaAgent
root@db-elasticsearch:/data# grep -e collector.backend_service -e agent.namespace -e agent.service_name /data/skywalking-agent/config/agent.config | grep -v '#'
agent.service_name=${SW_AGENT_NAME:dubbo-consumer1}
agent.namespace=${SW_AGENT_NAMESPACE:dubbo}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:skywalking.example.com:11800}

# 增加本地hosts配置
echo "192.168.182.61 skywalking.example.com" >> /etc/hosts

【skywalking 部署测试】_第23张图片

  • 客户端启动
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/dubbo/consumer/dubbo-client.jar
  • 客户端和服务端同时启动,页面访问客户端,后台查看到访问记录
    http://192.168.182.62:8080/hello?name=jack
    【skywalking 部署测试】_第24张图片
    【skywalking 部署测试】_第25张图片
    【skywalking 部署测试】_第26张图片

  • 查看skywalking UI界面
    【skywalking 部署测试】_第27张图片
    【skywalking 部署测试】_第28张图片

3. 部署dubboadmin,通过dubboadmin查看微服务注册与消费记录

dobboadmin依赖jdk8,直接在上面的服务器 dubbo-zk上安装

  • 上传tomcat以及dubboadmin.war
cd /apps/apache-tomcat-8.5.84/webapps/
rm -rf ./*
mv /home/zja/dubboadmin.war ./
unzip dubboadmin.war
# 修改ZK配置
cat /apps/apache-tomcat-8.5.84/webapps/dubboadmin/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://$ZK_SERVER1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
# 查看环境变量(上面设置过,直接引用)
`这里直接引用环境变量启动不生效,后面替换为了IP或者域名!`
root@dubbo-zk:/apps/apache-tomcat-8.5.84/webapps# echo $ZK_SERVER1
192.168.182.64

在这里插入图片描述

  • 启动服务测试
/apps/apache-tomcat-8.5.84/bin/catalina.sh run
  • 8080端口被占用,修改服务端口
    【skywalking 部署测试】_第29张图片
# 修改tomcat监听端口为8081,然后重启服务
vim /apps/apache-tomcat-8.5.84/conf/server.xml
    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
# 重新启动服务
/apps/apache-tomcat-8.5.84/bin/catalina.sh run
  • 再次启动报错,之前配置的环境变量不生效?
    【skywalking 部署测试】_第30张图片
  • 直接修改配置为IP后,启动成功,这里不能引用环境变量……
vim /apps/apache-tomcat-8.5.84/webapps/dubboadmin/WEB-INF/dubbo.properties
#dubbo.registry.address=zookeeper://192.168.182.64:2181
dubbo.registry.address=zookeeper://zookeeper1.zja.svc.local:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

# 直接使用IP或者配置域名,服务可以正常启动
echo "192.168.182.64 zookeeper1.zja.svc.local" >> /etc/hosts
  • 验证dubboadmin页面,root/root

http://192.168.182.64:8081/
【skywalking 部署测试】_第31张图片


4. 实现 skywalking 的钉钉告警

  1. 修改skywalking server服务告警配置文件
#  告警核心指标,参考文件 core.oal
cat /apps/skywalking/config/oal/core.oal
- service_resp_time #服务的响应时间
- service_sla #服务的http请求成功率SLA,比如99%等。
- service_cpm #表示每分钟的吞吐量.  service_apdex : 应用性能指数是0.8是0.x
- service_percentile: 指定最近多少数据范围内的响应时间百分比,即p99, p95, p90, p75, p50在内的数据统计结果
- endpoint_relation_cpm #端点的每分钟的吞吐量
- endpoint_relation_resp_time #端点的响应时间
- endpoint_relation_sla #端点的http请求成功率SLA,比如99%等。
- endpoint_relation_percentile ##端点的最近多少数据范围内的响应时间百分比,即p99、p95、p90、p75、p50在内的数据统计结果
# 备份原告警alarm文件,然后自定义测试配置文件
cp /apps/skywalking/config/alarm-settings.yml /apps/skywalking/config/alarm-settings.yml-bak
vim /apps/skywalking/config/alarm-settings.yml
rules: # 定义rule规则
  service_cpm_rule: # 唯一的规则名称,必须以_rule结尾
    # Metrics value need to be long, double or int
    metrics-name: service_cpm # 指标名称
    op: ">" # 操作符,>, >= , <, <= , ==
    threshold: 1 #指标阈值
    # The length of time to evaluate the metrics
    period: 2 #评估指标的间隔周期
    # How many times after the metrics match the condition, will trigger alarm
    count: 1 #匹配成功多少次就会触发告警
    # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period. #silence-period: 3
    silence-period: 2 #触发告警后的静默时间
    message: "dubbo-provider service_cpm  请求次数大于1了" #告警信息
dingtalkHooks:
  textTemplate: |-
    {
      "msgtype": "text",
      "text": {
        "content": "Apache SkyWalking Alarm: \n %s."
      } 
    }
  webhooks: 
    - url: https://oapi.dingtalk.com/robot/send?access_token=dd9dbe4db622af7419b733a719e0c19f7794bbcc78fe394b985a7073b3fd5eb6 #注意钉钉关键字

# 修改完配置需要重启服务使配置生效!!
systemctl restart skywalking.service
  1. 多次访问验证告警
    【skywalking 部署测试】_第32张图片

二、扩展

1. 实现 Python Django 项目的请求链路跟踪

需要安装python3,在dubo-zk服务器安装python进行测试
skywalking-python agent 官网指导链接

  1. 安装python3,并测试agent链接
# 安装python3以及pip命令
apt install python3 -y
apt install python3-pip -y
# 安装skywalking模块
pip3 install "apache-skywalking"

【skywalking 部署测试】_第33张图片

  • 测试agent链接
from skywalking import agent, config
config.init(collector_address='192.168.182.61:11800', service_name='python-app-test') #测试注册
agent.start()

【skywalking 部署测试】_第34张图片

  • 查看skywalking,测试OK
    【skywalking 部署测试】_第35张图片
  1. 下载django项目正式测试
  • 将django-test.tgz 解压到/apps路径下
cd /apps/django-test/
#- 安装依赖模块:
pip3 install -r requirements.txt
#- 创建django项目mysite,如果解压包里含有同名的mysite, rm -rf mysite,或者换个名字
django-admin startproject mysite
#- 创建应用
cd mysite
python3 manage.py startapp myapp
#- 初始化数据库
python3 manage.py makemigrations
python3 manage.py migrate

# ---
# 创建管理员,用于登录web控制台 root/root:
python3 manage.py createsuperuser
# skywarking环境变量:
export SW_AGENT_NAME='python-app1-django'
export SW_AGENT_NAMESPACE='python-project'
export SW_AGENT_COLLECTOR_BACKEND_SERVICES='192.168.182.61:11800'
# 修改配置,允许任何客户端可以访问:
vim mysite/settings.py
ALLOWED_HOSTS = ["*",]
# 启动服务
sw-python -d run python3 manage.py runserver 192.168.182.64:80
  • 页面查看 http://192.168.182.64/
    【skywalking 部署测试】_第36张图片
  • 登录管理界面 http://192.168.182.64/admin
    【skywalking 部署测试】_第37张图片
  • 查看skywalking UI,验证OK
    【skywalking 部署测试】_第38张图片

2. 实现 OpenResty(nginx) 及后端 Java 服务的全链路请求链路跟踪

OpenResty 是基于nginx做的二次开发,兼容nginx配置并支持LUA
nginx是通过lua扩展,需要将nginx重新编译,用来支持lua

  1. 安装OpenResty
  • 安装编译环境
# 编译环境
apt install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip
  • 编译安装openresty
    编译安装openresty 官网链接
cd /apps
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
tar xvf openresty-1.21.4.1.tar.gz
cd openresty-1.21.4.1/

./configure --prefix=/apps/openresty  \
--with-luajit \
--with-pcre \
--with-http_iconv_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module

  • 运行编译
make && make install

【skywalking 部署测试】_第39张图片

  • 测试
/apps/openresty/bin/openresty  -t

在这里插入图片描述

# 启动服务
/apps/openresty/bin/openresty

【skywalking 部署测试】_第40张图片
【skywalking 部署测试】_第41张图片
2. 配置skywalking nginx agent

https://github.com/apache/skywalking-nginx-lua

  • 安装nginx lua agent
cd /data/
wget https://github.com/apache/skywalking-nginx-lua/archive/refs/tags/v0.6.0.tar.gz
# 修改安装包名字更容易识别
mv v0.6.0.tar.gz skywalking-nginx-lua-v0.6.0.tar.gz
tar xvf skywalking-nginx-lua-v0.6.0.tar.gz

cd /apps/openresty/nginx/conf/
vim nginx.conf
  include /apps/openresty/nginx/conf/conf.d/*.conf;
mkdir conf.d

【skywalking 部署测试】_第42张图片

  • 创建自定义confi配置文件
vim /apps/openresty/nginx/conf/conf.d/www.myserver.com.conf
    lua_package_path "/data/skywalking-nginx-lua-0.6.0/lib/?.lua;;";
    # Buffer represents the register inform and the queue of the finished segment
    lua_shared_dict tracing_buffer 100m;

    # Init is the timer setter and keeper
    # Setup an infinite loop timer to do register and trace report.
    init_worker_by_lua_block {
        local metadata_buffer = ngx.shared.tracing_buffer
        metadata_buffer:set('serviceName', 'myserver-openresty-nginx') ---#在skywalking 显示的当前server 名称,用于区分事件是有哪个服务产生的
        -- Instance means the number of Nginx deloyment, does not mean the worker instances
        metadata_buffer:set('serviceInstanceName', 'myserver-openresty-nginx-node1') --- #当前示例名称,用户事件是在那台服务器产生的 startBackendTimer 配置域名会有问题,暂时使用IP写死
        -- type 'boolean', mark the entrySpan include host/domain
        metadata_buffer:set('includeHostInEntrySpan', false) ---#在span信息中包含主机信息

        -- set randomseed
        require("skywalking.util").set_randomseed()
		
        require("skywalking.client"):startBackendTimer("http://192.168.182.61:12800")

        -- Any time you want to stop reporting metrics, call `destroyBackendTimer`
        -- require("skywalking.client"):destroyBackendTimer()

        -- If there is a bug of this `tablepool` implementation, we can
        -- disable it in this way
        -- require("skywalking.util").disable_tablepool()

        skywalking_tracer = require("skywalking.tracer")
    }

    server {
        listen 80;
        server_name   www.myserver.com;
        location / {
            root   html;
            index  index.html index.htm;
            #手动配置的一个上游服务名称或DNS名称,在skywalking会显示此名称
            rewrite_by_lua_block {
                ------------------------------------------------------
                -- NOTICE, this should be changed manually
                -- This variable represents the upstream logic address
                -- Please set them as service logic name or DNS name
                --
                -- Currently, we can not have the upstream real network address
                ------------------------------------------------------
                skywalking_tracer:start("www.myserver.com")
                -- If you want correlation custom data to the downstream service
                -- skywalking_tracer:start("upstream service", {custom = "custom_value"})
            }
            #用于修改响应内容(注入JS)
            body_filter_by_lua_block {
                if ngx.arg[2] then
                    skywalking_tracer:finish()
                end
            } 
            #记录日志
            log_by_lua_block { 
                skywalking_tracer:prepareForReport()
            } 

        }

        location /myserver {
            default_type text/html;

            rewrite_by_lua_block {
                ------------------------------------------------------
                -- NOTICE, this should be changed manually
                -- This variable represents the upstream logic address
                -- Please set them as service logic name or DNS name
                --
                -- Currently, we can not have the upstream real network address
                ------------------------------------------------------
                skywalking_tracer:start("www.myserver.com")
                -- If you want correlation custom data to the downstream service
                -- skywalking_tracer:start("upstream service", {custom = "custom_value"})
            }
            # 62节点部署单机服务 apache 
            proxy_pass http://192.168.182.62;

            body_filter_by_lua_block {
                if ngx.arg[2] then
                    skywalking_tracer:finish()
                end
            }

            log_by_lua_block {
                skywalking_tracer:prepareForReport()
            }
        }

        location /hello {
            default_type text/html;

            rewrite_by_lua_block {
                ------------------------------------------------------
                -- NOTICE, this should be changed manually
                -- This variable represents the upstream logic address
                -- Please set them as service logic name or DNS name
                --
                -- Currently, we can not have the upstream real network address
                ------------------------------------------------------
                skywalking_tracer:start("www.myserver.com")
                -- If you want correlation custom data to the downstream service
                -- skywalking_tracer:start("upstream service", {custom = "custom_value"})
            }
            # 稳定掌门在在62节点部署的微服务客户端
            proxy_pass http://192.168.182.62:8080;

            body_filter_by_lua_block {
                if ngx.arg[2] then
                    skywalking_tracer:finish()
                end
            }

            log_by_lua_block {
                skywalking_tracer:prepareForReport()
            }
        }
}
  • 启动后端服务
# 62节点安装单机apache,用来测试上面配置文件中的路径/myserver 
apt install apache2
systemctl restart apache2.service
# 同时需要创建myserver路径
/var/www/html/myserver/index.html
<h1> this is apache2 myserver page </h1>

【skywalking 部署测试】_第43张图片

  • 测试配置生效后启动服务
root@dubbo-zk:/apps/openresty/nginx/conf/conf.d# /apps/openresty/nginx/sbin/nginx -t
nginx: the configuration file /apps/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/openresty/nginx/conf/nginx.conf test is successful
# 加载配置使生效
/apps/openresty/nginx/sbin/nginx -s reload

  • 本机配置hosts配置,通过域名访问

通过IP访问会提示404
【skywalking 部署测试】_第44张图片

  • 通过域名访问测试正常
    【skywalking 部署测试】_第45张图片
  • 查看skywalking UI

【skywalking 部署测试】_第46张图片
【skywalking 部署测试】_第47张图片


测试软件包下载地址:[gitee下载地址](https://gitee.com/my_zja/geek-edu-apps/tree/master/skywalking)


  1. 图片来源:skywalking链路追踪 ↩︎

你可能感兴趣的:(skywalking,运维)