开源可观测平台 Apache Skywalking 中文入门指南

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

190be5bbc9f7647fff3c0f89a4042903.png

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 实现的.

66b123b58b9a3011fc73bd92e075c65b.jpeg
img 架构图

9a7269fc2b46180a5cb647e5640e8f1e.png

SkyWalking架构图

疑问

  1. 还是不明白什么是skywalking

    所谓的skywalking我们可以立即为链路追踪的一个实现,那么什么是链路追踪呢,简单说就是流量后的一系列的东西南北流量的一个呈现。

  2. 为什么要用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展示

5c47ca59d138e23847470727736030bc.png
image-20240516102301190

上图中的数据可以暂时忽略。

微服务接入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也是需要修改的哦。

指标说明

a57d3f7dd2639e6748425e1f054c34ee.png
image-20240516105901859

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说明
cede6fae93371e0b9d1e9208de84b216.png
image-20240516114028739
82a1bc4591d77cd5e1308a073ff5baac.png
image-20240516141427608
7b6b260cf4aa7f377e93a1a8642f36bd.png
image-20240516144048614
18b8c21d7d07482614e679f7a1b21bf3.png
image-20240516145654722
Database说明
adab1b549f37c50d7276b820a015ceab.png
image-20240516150552515

常规使用

5f61910aab9c0e794959ee4f005e9289.png
image-20240516163254982

当我们去使用skywalking时,其实最多的还是对链路的查看,例如:查看那个接口响应时间超时了等等。

性能剖析

性能刨析我们应该如何使用呢,什么场景下去使用呢。

适应场景
  • 通过追踪我们可以发现一个接口响应时间较长,此时我们就可以使用性能剖析来查看更加具体的异常信息。

如何使用
fdfdc9a8adbd38ccc364f5316b8716f2.png
image-20240520143641070

首先点击性能剖析,然后点击新建任务

783575bdcff5442b39543b34bb6148d9.png
image-20240520143814224

上图我们有一个端点名称,那么这个端点名称我们解释的是接口,那么具体我们应该如何查找这个接口呢,前边我们说过,当我们使用性能剖析时,是从追踪中看到了一个端点响应时间过长了。

777c814def9277fe5d89a3bfb326fc81.png
image-20240520144027560

告警

既然我们已经实现了一个链路追踪,那么我们应该如何去实现告警呢,毕竟我们不可能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。

1785d3b123dda81103bfe9448284ca19.gif

🚀 最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

📕 关注『奇妙的 Linux 世界』公众号,带你开启有趣新生活!更多好用好玩的软件资源,可访问 https://666666.dev 免费获取。

9d99a0164cad91f0ca7fd66399e67b8d.png

你可能还喜欢

点击下方图片即可阅读

36b7b6ab4b57c4fe73b9e5148a6a2eb0.png

Github 星标 1.6K: 一款开源免费,Go 语言编写的多用途 HTTP 反向代理和转发工具

25ead4663266d2a4c1c640ffbd6bbb7d.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

dd594e1b22928d23cd7ab25e6c194023.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

Apache SkyWalking 是一个开源的应用性能监控和观测平台,它支持分布式系统、微服务架构和容器化环境的性能监控。通过监控系统的请求流和调用链,它可以帮助开发者和运维人员快速定位和解决性能问题,提高应用的稳定性和可靠性。 《Apache SkyWalking实战PDF》是一本关于使用 Apache SkyWalking 进行应用性能监控实践的电子书。该书通过详细介绍 SkyWalking 的工作原理、部署和配置方法,以及如何使用 SkyWalking 进行性能监控和问题排查,帮助读者全面了解和掌握 SkyWalking的使用技巧。 《Apache SkyWalking实战PDF》主要包括以下内容: 1. Apache SkyWalking 的概述和特性:介绍了 SkyWalking 的基本原理和功能,包括请求追踪、性能指标监控、告警和日志分析等。 2. SkyWalking 的部署和配置:详细介绍了如何在各种环境下(包括单机和分布式环境)部署和配置 SkyWalking,包括安装和运行 SkyWalking 服务器和探针。 3. 实践案例和示例:通过实际的案例和示例,展示了如何使用 SkyWalking 进行性能监控和问题排查。包括如何分析请求的调用链、如何根据性能指标进行优化、如何发现和解决性能瓶颈等。 4. SkyWalking 的进阶内容:介绍了 SkyWalking 的高级功能和扩展,如分布式追踪、服务拓扑图、故障定位和容量规划等。 通过阅读《Apache SkyWalking实战PDF》,读者可以了解如何快速搭建和使用 SkyWalking 进行应用性能监控,提高应用的性能和可靠性,解决和预防性能问题。这对于开发者、运维人员和系统架构师来说都是一本实用的参考书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值