文章目录
- SkyWalking实现基于容器环境Dubbo微服务链路跟踪
- 部署Dubbo Provider
- 构建Dubbo Provider镜像
- 运行dubbo-provider
- 部署Dubbo Consumer
- 构建Dubbo Consumer镜像
- 运行dubbo-consumer
- 验证
- SkyWalking收集python项目数据
- Skywalking告警
- Skywalking指标
- Skywalking告警规则
SkyWalking实现基于容器环境Dubbo微服务链路跟踪
在k8s中运行zookeeper集群可以参考https://blog.csdn.net/weixin_43266367/article/details/126856526?spm=1001.2014.3001.5501
这里已经提前再K8s集群中运行了一个zookeeper集群,如下图:
部署Dubbo Provider
构建Dubbo Provider镜像
Dockerfile如下:
FROM harbor-server.linux.io/base-images/ubuntu-jdk-base:8u131
LABEl maintainer="admin@163.com"
RUN mkdir -p /apps/dubbo/provider
ADD skywalking-agent /apps/dubbo/provider/skywalking-agent
ADD dubbo-server.jar /apps/dubbo/provider/
ADD run_java.sh /apps/dubbo/provider/
RUN useradd -m -u 2023 user1 && chown -R user1:user1 /apps/ && chmod +x /apps/dubbo/provider/*.sh
CMD ["/apps/dubbo/provider/run_java.sh"]
所有构建文件如下图所示:
其中skywalking-agent目录是SkyWalking Java Agent解压后的目录,需要修改其中的配置文件指定服务名称和SkyWalking Server的地址
vim kywalking-agent/config/agent.config
########################################
20 agent.service_name=${SW_AGENT_NAME:dubbo-provider} #agent监控的项目或服务在SkyWalking UI上对应的服务名称
21
22 # The agent namespace
23 agent.namespace=${SW_AGENT_NAMESPACE:n70} #agent所在的名称空间,可以用来标示服务所属项目
104 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.122.28:11800} #指定SkyWalking Server的地址和端口
dubbo-server.jar是项目代码,里面的配置文件config.properties已经指定了zookerper的地址
root@sw-agent-node-01:~/dubbo-server# cat config.properties
dubbo.registry=zookeeper://zookeeper3.default.svc.cluster.local:2181?backup=zookeeper2.default.svc.cluster.local:2181,zookeeper1.default.svc.cluster.local:2181
dubbo.port=20880
run_java.sh是服务启动脚本,内容如下:
#!/bin/bash
su - user1 -c "java -javaagent:/apps/dubbo/provider/skywalking-agent/skywalking-agent.jar -jar /apps/dubbo/provider/dubbo-server.jar"
执行构建,上传镜像到仓库
docker build -t harbor-server.linux.io/n70/dubbo-provider:v1.0 .
docker push harbor-server.linux.io/n70/dubbo-provider:v1.0
运行dubbo-provider
在K8s集群上运行dubbo-provider,部署文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dubbo-provider
spec:
selector:
matchLabels:
app: dubbo-provider
replicas: 2
template:
metadata:
labels:
app: dubbo-provider
spec:
containers:
- name: dubbo-provider
image: harbor-server.linux.io/n70/dubbo-provider:v1.0
imagePullPolicy: Always
ports:
- containerPort: 20880
将部署文件应用到集群上,等到Pod就绪
查看Pod的日志确保服务已经正常启动
部署Dubbo Consumer
构建Dubbo Consumer镜像
DockerFile如下:
FROM harbor-server.linux.io/base-images/ubuntu-jdk-base:8u131
LABEl maintainer="admin@163.com"
RUN mkdir -p /apps/dubbo/consumer
ADD skywalking-agent /apps/dubbo/consumer/skywalking-agent
ADD dubbo-client.jar /apps/dubbo/consumer/
ADD run_java.sh /apps/dubbo/consumer/
RUN useradd -m -u 2023 user1 && chown -R user1:user1 /apps/ && chmod +x /apps/dubbo/consumer/*.sh
CMD ["/apps/dubbo/consumer/run_java.sh"]
所有构建文件如下图所示:
其中skywalking-agent目录是SkyWalking Java Agent解压后的目录,需要修改其中的配置文件指定服务名称和SkyWalking Server的地址
vim kywalking-agent/config/agent.config
########################################
20 agent.service_name=${SW_AGENT_NAME:dubbo-consumer}
21
22 # The agent namespace
23 agent.namespace=${SW_AGENT_NAMESPACE:n70}
104 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.122.28:11800}
run_java.sh是服务启动脚本,内容如下:
#!/bin/bash
su - user1 -c "java -javaagent:/apps/dubbo/consumer/skywalking-agent/skywalking-agent.jar -jar /apps/dubbo/consumer/dubbo-client.jar"
dubbo-client.jar是项目代码,里面的配置文件config.properties已经指定了zookerper的地址
root@sw-agent-node-01:~/dubbo-client# cat config.properties
dubbo.registry=zookeeper://zookeeper1.default.svc.cluster.local:2181?backup=zookeeper2.default.svc.cluster.local:2181,zookeeper3.default.svc.cluster.local:2181
执行构建,上传镜像
docker build -t harbor-server.linux.io/n70/dubbo-consumer:v1.0 .
dockers push harbor-server.linux.io/n70/dubbo-consumer:v1.0
运行dubbo-consumer
在K8s集群上运行dubbo-consumer,部署文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: dubbo-consumer
spec:
selector:
matchLabels:
app: dubbo-consumer
replicas: 2
template:
metadata:
labels:
app: dubbo-consumer
spec:
containers:
- name: dubbo-consumer
image: harbor-server.linux.io/n70/dubbo-consumer:v1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: dubbo-consumer-svc
spec:
type: NodePort
selector:
app: dubbo-consumer
ports:
- port: 80
targetPort: 8080
protocol: TCP
nodePort: 30080
将部署文件应用到集群上,等到Pod就绪
查看Pod的日志确保服务已经正常启动
验证
通过nodeport访问dubbo-consumer 产生一些数据
在SkyWalking中查看对应Service的数据
SkyWalking收集python项目数据
skywalking python-agent官方文档:https://skywalking.apache.org/docs/skywalking-python/v1.0.0/readme/
创建一个Django测试项目
pip3 install Django
django-admin startproject mysite
cd mysite/
python3 manage.py startapp app1
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuse
安装skywalking python-agent
pip3 install apache-skywalking
通过环境变量传递一些配置给skywalking python-agent,其他可以使用的变量可以参考:https://skywalking.apache.org/docs/skywalking-python/v1.0.0/en/setup/configuration/
export SW_AGENT_NAME='python-app1'
export SW_AGENT_NAMESPACE='n70'
export export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.122.28:11800
启动Django项目
sw-python -d run python3 manage.py runserver 192.168.122.32:80
sw-python是skywalking python-agent提供的一个命令行工具,使用它运行python项目就可以收集数据发送到skywalking server
访问Django页面,产生一些数据
在SkyWalking UI上查看对应的数据
Skywalking告警
Skywalking告警设置官方文档:https://skywalking.apache.org/docs/main/v9.3.0/en/setup/backend/backend-alarm/
Skywalking指标
Skywalking的告警流程和Prometheus类似,首先定义一个告警规则文件,根据里面rule的定义判断指标是否超过阈值,是否需要触发告警,告警触发后再通过wenhook发送给接收者。
Skywalking的指标是通过查询后端存储中的数据生成的,而不是通过agent收集的。Skywalking默认已经提供了一些指标定义文件(.oal文件),存放在Skywalking安装目录下的config/oal/目录下。
指标定义的格式是:
<metrics_name> = <Query SQL>
core.oal文件中有一些常用指标:
service_resp_time #服务响应时间
service_sla #服务的请求成功率SLA, 比如99%
service_cpm #服务每分钟的吞吐量
service_percentile #指定最近多少数据范围内的响应时间百分比,即p99、p95、p90在内的数据统计结果
service_apdex #服务性能指标评分
endpoint_cpm #端点每分钟吞吐量
endpoint_resp_time #端点响应时间
endpoint_sla #端点的请求成功率SLA, 比如99%
endpoint_percentile #指定最近多少数据范围内的响应时间百分比,即p99、p95、p90在内的数据统计结果
Skywalking告警规则
Skywalking默认提供了一个告警规则示例文件,Skywalking安装目录下的config/alarm-settings.yml
Skywalking的告警规则文件主要包含两部分:一部分是rule定义;另一半部分是webhook定义,用于指定告警接收人
告警规则rule定义格式:
service_resp_time_rule: #规则名称,唯一的,必须以_rule结尾
metrics-name: service_resp_time #指标名称
op: ">" #操作符,支持>、<、>=、<=、==
threshold: 1000 #指标阈值
period: 10 #检测间隔周期,单位分钟
count: 3 #匹配成功多少次才会触发告警
silence-period: 5 #告警后的静默时间,单位分钟
message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes. #告警信息
下面是一个示例文件:
root@sw-node-01:/usr/local/src/apache-skywalking-apm-bin# cat config/alarm-settings.yml
rules:
service_cpm_rule: #监控所有服务的每分钟请求量,如果超过1就告警
metrics-name: service_cpm
op: ">"
threshold: 1 #为了测试,故意设置为1
period: 10
count: 1
silence-period: 5
message: Cpm of service {name} is more than 1 in last 10 minutes.
dingtalkHooks: #钉钉接收者定义
textTemplate: |- #消息模板
{
"msgtype": "text",
"text": {
"content": "Apache SkyWalking Alarm \n alertname: %s."
}
}
webhooks: #钉钉webhook地址
- url: https://oapi.dingtalk.com/robot/send?access_token=a013ec66bf3cf4dc338e167982f349bf9bd2f3013830850e8e1ba4c1168330c5
访问前面的dubbo-consumer,使skywalking产生告警
钉钉收到的告警信息