公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
Skywalking介绍
skywalking是一个开源的可观测平台,用户从服务和云原生基础设施收集、分析、聚合以及可视化数据的功能。skywalking提供了一个简便的方式来使我们可以清晰的观测分布式系统,设置可以跨多个平台。
skywalking更是一个现代化的应用程序性能监控(Application Performance Monitoring)APM系统,尤其专为云原生、基于容器的分布式系统涉及。
基础概念
skywalking为服务(service)、服务实例(service instance)以及端点(endpoint)提供了可观测能力。
服务(Service):表示对请求提供相同行为的一组负载。例如k8s中的service
服务实例(Service Instance):一组负载中的一个实例。例如pod
端点(Endpoint):对于特定服务所接收的请求路径,如HTTP的URL路径和gRPC服务的类名+方法签名。
OAP观测分析平台(Observability Analysis Platform),其从多种数据源接收数据,这些数据分为两大类,链路追踪、度量指标。
链路追踪:包括Skywalking原生数据格式,Zipkin v1 和v2数据格式,以及jaeger数据格式。
度量指标:Skywalking集成了服务网格平台,如istio、envoy和linkerd,并在数据面板和控制面板进行观测。
可以同时使用提供的任何集成解决方案,比如 SkyWalking 日志插件或工具包, SkyWalking 还提供了可视化集成来对追踪和日志进行绑定, 这是通过使用 trace id 和 span id 实现的.
疑问
还是不明白什么是skywalking
❝
所谓的skywalking我们可以立即为链路追踪的一个实现,那么什么是链路追踪呢,简单说就是流量后的一系列的东西南北流量的一个呈现。
为什么要用skywalking
❝
主要是为了检测接口的质量,简单理解就是那个接口响应时间过长了。
案例演示
ES7部署
这里我么使用单机版进行演示,如果是对监控数据要求较高,建议使用es集群,这里我们使用es7即可。
skywalking部署
初始化job
apiVersion: batch/v1
kind: Job
metadata:
name: "skywalking-es-init"
namespace: skywalking
labels:
app: skywalking-job
spec:
template:
metadata:
name: "skywalking-es-init"
labels:
app: skywalking-job
spec:
serviceAccountName: skywalking-oap
restartPolicy: Never
initContainers:
- name: wait-for-elasticsearch
image: busybox:1.30
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'for i in $(seq 1 60); do nc -z -w3 192.168.70.215 9200 && exit 0 || sleep 5; done; exit 1']
containers:
- name: oap
image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:8.9.0
imagePullPolicy: IfNotPresent
env:
- name: JAVA_OPTS
value: "-Xmx2g -Xms2g -Dmode=init"
- name: SW_STORAGE
value: elasticsearch
- name: SW_STORAGE_ES_CLUSTER_NODES
value: "192.168.70.215:9200"
- name: SW_TELEMETRY
value: "prometheus"
- name: SW_PROMETHEUS_FETCHER_ACTIVE
value: "true"
- name: SW_OTEL_RECEIVER
value: "default"
- name: SW_OTEL_RECEIVER_ENABLED_OC_RULES
value: "oap"
oap告警规则文件
apiVersion: v1
kind: ConfigMap
metadata:
name: sky-alert
namespace: skywalking
data:
alarm-settings.yml: |
rules:
service_resp_time_rule:
metrics-name: service_resp_time # 告警规则,也就是ui中的指标
op: ">" # 大于 还有 < 、=
threshold: 50 # 阈值
period: 2 # 多久告警规则需要被检查一下
count: 2 # 超过阈值的次数达到
silence-period: 2 # 多久的一个周期,重复告警只告警一次,一般和period保持一致即可
message: 服务{name}响应时间大于50毫秒 # 告警信息
endpoint_avg_rule:
metrics-name: endpoint_avg
op: ">"
threshold: 3
period: 2
count: 1
message: 接口响应时间大于3毫秒
webhooks:
- http://192.168.10.70:8888/alert/sky
❝更多告警详情可以参考:https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-alarm/
oap
apiVersion: v1
kind: Service
metadata:
name: oap-svc
namespace: skywalking
labels:
app: oap
spec:
type: ClusterIP
ports:
- port: 11800
name: grpc
- port: 12800
name: rest
selector:
app: oap
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: oap
name: oap
namespace: skywalking
spec:
replicas: 1
selector:
matchLabels:
app: oap
template:
metadata:
labels:
app: oap
spec:
serviceAccountName: skywalking-oap
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
app: "skywalking"
initContainers:
- name: wait-for-elasticsearch
image: busybox:1.30
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'for i in $(seq 1 60); do nc -z -w3 192.168.70.215 9200 && exit 0 || sleep 5; done; exit 1']
containers:
- name: oap
image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:8.9.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /skywalking/config/alarm-settings.yml
name: sky-alert
subPath: alarm-settings.yml
livenessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
periodSeconds: 20
ports:
- containerPort: 11800
name: grpc
- containerPort: 12800
name: rest
env:
- name: JAVA_OPTS
value: "-Dmode=no-init -Xmx2g -Xms2g"
- name: SW_CLUSTER
value: kubernetes
- name: SW_CLUSTER_K8S_NAMESPACE
value: "skywalking"
- name: SW_CLUSTER_K8S_LABEL
value: "app=skywalking,release=skywalking,component=oap"
# 记录数据
- name: SW_CORE_RECORD_DATA_TTL
value: "2"
# Metrics数据
- name: SW_CORE_METRICS_DATA_TTL
value: "2"
- name: SKYWALKING_COLLECTOR_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: SW_STORAGE
value: "elasticsearch"
- name: SW_STORAGE_ES_CLUSTER_NODES
value: "192.168.70.215:9200"
- name: SW_TELEMETRY
value: "prometheus"
- name: SW_PROMETHEUS_FETCHER_ACTIVE
value: "true"
- name: SW_OTEL_RECEIVER
value: "default"
- name: SW_OTEL_RECEIVER_ENABLED_OC_RULES
value: "oap"
- name: SW_PROMETHEUS_FETCHER
value: "default"
volumes:
- name: sky-alert
configMap:
name: sky-alert
rbac
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: skywalking
name: skywalking-oap
namespace: skywalking
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: skywalking
namespace: skywalking
labels:
app: skywalking
rules:
- apiGroups: [""]
resources: ["pods", "endpoints", "services", "nodes"]
verbs: ["get", "watch", "list"]
- apiGroups: ["extensions"]
resources: ["deployments", "replicasets"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: skywalking
namespace: skywalking
labels:
app: skywalking
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: skywalking
subjects:
- kind: ServiceAccount
name: skywalking-oap
namespace: skywalking
ui
apiVersion: v1
kind: Service
metadata:
labels:
app: ui
name: ui-svc
namespace: skywalking
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
app: ui
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
namespace: skywalking
labels:
app: ui
spec:
replicas: 1
selector:
matchLabels:
app: ui
template:
metadata:
labels:
app: ui
spec:
affinity:
containers:
- name: ui
image: skywalking.docker.scarf.sh/apache/skywalking-ui:8.9.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: page
env:
- name: SW_OAP_ADDRESS
value: http://oap-svc:12800 #根据oap的svc一致
UI展示
❝上图中的数据可以暂时忽略。
微服务接入skywalking
这里我们不做过多的说明了,我们已经以若依项目为例。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-auth
namespace: dev
labels:
app: ruoyi-auth
spec:
replicas: 1
selector:
matchLabels:
app: ruoyi-auth
strategy:
rollingUpdate:
maxSurge: 70%
maxUnavailable: 30%
type: RollingUpdate
template:
metadata:
labels:
app: ruoyi-auth
spec:
terminationGracePeriodSeconds: 60
initContainers:
- name: agent-container
image: apache/skywalking-java-agent:8.9.0-alpine
env:
- name: SW_LOGGING_LEVEL
value: ERROR
- name: SW_AGENT_TRACE_IGNORE_PATH
value: '/actuator/**'
volumeMounts:
- mountPath: /agent
name: skywalking-agent
command: ["/bin/sh"]
args: ["-c","cp -R /skywalking/agent /agent/ "]
resources:
requests:
cpu: 0.2
memory: 200Mi
limits:
cpu: 0.2
memory: 200Mi
volumes:
- name: skywalking-agent
emptyDir: {}
containers:
- name: ruoyi-auth
image: registry.cn-beijing.aliyuncs.com/kubesre03/ruoyi-auth:v3.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8090
env:
- name: JAVA_SERVICE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
- name: JAVA_SERVICE_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: NACOS_SERVICE_NAME
value: nacos-headless
- name: NACOS_NAMESPACE
value: public
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/skywalking-agent/agent/skywalking-agent.jar"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: oap-svc.skywalking.svc.cluster.local:11800
- name: SW_AGENT_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['app']
### 启动探针
startupProbe:
httpGet:
port: 8090
path: /actuator/health/ping
initialDelaySeconds: 300
failureThreshold: 30
periodSeconds: 30
### 就绪探针
readinessProbe:
httpGet:
port: 8090
path: /actuator/health/ping
initialDelaySeconds: 30 # 第一次执行探针前等待的时间
periodSeconds: 30 # 每隔多少秒执行一次
failureThreshold: 5
### 存活探针
livenessProbe:
httpGet:
port: 8090
path: /actuator/health/ping
initialDelaySeconds: 30
periodSeconds: 30
failureThreshold: 3
timeoutSeconds: 5
resources:
requests:
cpu: 0.3
memory: 800Mi
limits:
cpu: 0.3
memory: 800Mi
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","/data/down-nacos.sh"]
volumeMounts:
- mountPath: /skywalking-agent
name: skywalking-agent
❝这里我们仅展示了若依中auth的yaml文件,同样的system、gateway也是需要修改的哦。
指标说明
❝APM:以全局(Global)、服务(Service)、服务实例(Instance)、端点(Endpoint)的维度展示各项指标。
Database:展示数据库的各项指标。
Event:skywalking事件
Istio:istio控制平面
Istio Data Plane:istio数据平面
K8s:可以参考https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-k8s-monitoring/
SelfObservability:展示OAP服务端的各项指标。
VM:虚拟机
Web Browser:以服务和页面的维度展示Web浏览器端的各项指标。
APM说明
Database说明
常规使用
❝当我们去使用skywalking时,其实最多的还是对链路的查看,例如:查看那个接口响应时间超时了等等。
性能剖析
性能刨析我们应该如何使用呢,什么场景下去使用呢。
适应场景
通过追踪我们可以发现一个接口响应时间较长,此时我们就可以使用性能剖析来查看更加具体的异常信息。
如何使用
❝首先点击性能剖析,然后点击新建任务
上图我们有一个端点名称,那么这个端点名称我们解释的是接口,那么具体我们应该如何查找这个接口呢,前边我们说过,当我们使用性能剖析时,是从追踪中看到了一个端点响应时间过长了。
告警
既然我们已经实现了一个链路追踪,那么我们应该如何去实现告警呢,毕竟我们不可能7x24小时都看着链路情况,所以有了告警的我们才算真正的实现了一个完整的闭环。
告警规则
我们暂时不需要从0开始学习如何去写一个告警规则,我们只要能看懂其中字段的含义即可。以下示例:
service_resp_time_rule:
metrics-name: service_resp_time # 告警规则,也就是ui中的指标
op: ">" # 大于 还有 < 、=
threshold: 50 # 阈值
period: 2 # 多久告警规则需要被检查一下
count: 2 # 超过阈值的次数达到
silence-period: 2 # 多久的一个周期,重复告警只告警一次,一般和period保持一致即可
message: 服务{name}响应时间大于50毫秒 # 告警信息
endpoint_avg_rule:
metrics-name: endpoint_avg
op: ">"
threshold: 3
period: 2
count: 1
message: 接口响应时间大于3毫秒
❝每一个告警规则,都要以_rule结尾。
更多的告警规则,我们可以参考:https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-alarm/#rules
告警推送
这里我们就不演示了,具体的可以参考:
https://mp.weixin.qq.com/s/qaH3WaSOSa8LV9sMtiacPw
告警数据
了解即可
[{
"scopeId": 1,
"scope": "SERVICE",
"name": "ruoyi-system",
"id0": "cnVveWktc3lzdGVt.1",
"id1": "",
"ruleName": "service_resp_time_rule",
"alarmMessage": "Response time of service ruoyi-system is more than 1000ms in 3 minutes of last10minutes.",
"tags": [],
"startTime": 1713941362910
},
{
"scopeId": 2,
"scope": "SERVICE",
"name": "ruoyi-auth",
"id0": "cnVveWktc3lzdGVt.1",
"id1": "",
"ruleName": "service_resp_time_rule",
"alarmMessage": "Response time of service ruoyi-system is more than 1000ms in 3 minutes of last10minutes.",
"tags": [],
"startTime": 1713941362910
}]
[
{
"scopeId": 3,
"tags": []
},
{
"scopeId": 3,
"tags": []
}
]
本文转载自:「蜀道运维」,原文:https://url.hi-linux.com/S7ClZ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
🚀 最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
📕 关注『奇妙的 Linux 世界』公众号,带你开启有趣新生活!更多好用好玩的软件资源,可访问 https://666666.dev 免费获取。
你可能还喜欢
点击下方图片即可阅读
Github 星标 1.6K: 一款开源免费,Go 语言编写的多用途 HTTP 反向代理和转发工具
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!