天天看點

淺談Skywalking微服務監控分析

Skywalking架構

淺談Skywalking微服務監控分析

快速開始

一直在尋找一款全能的監控平台,可以滿足名額、日志、調用鍊等多方面一站式觀察。Prometheus 在名額方面很強大,但調用鍊需要依賴需要依賴第三方。而Skywalking 可以一站式解決上面所有問題,其工作原理比較簡單,易于二次開發。其架構分為服務端、收集端、前端。收集端既支援背景服務也支援前端服務,例如java項目可以以javaagent 的方式內建skywalking-agent.jar元件,這個元件會讀取配置檔案(agent.config)并拉起插件(預設拉起 plugins、activations兩個目錄下的插件),而收集日志和名額的任務都是依賴這些插件完成的,比如要忽視某些方法被追蹤,那就使用apm-trace-ignore-plugin-x.x.x.jar 插件;如果想增強某些方法那就使用apm-customize-enhance-plugin-x.x.x.jar 插件等。

OAP服務

啟動OAP服務,OAP服務相當于Skywalking的背景服務,這裡采用docker的安裝方式,skywalking 預設内置H2存儲,也可以是ES、Mysql等,下面介紹兩種docker啟動方案,當然你也可以直接下載下傳分發版本通過本地的方式啟動。

方案一: 使用預設的H2作為存儲啟動,适合本地測試環境

docker run --name oap -p 11800:11800 -p 12800:12800 -e TZ=Asia/Shanghai --restart always -d apache/skywalking-oap-server:8.6.0-es7

docker run --name oapui --link oap:oap -p 8080:8080 -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=oap:12800 --restart always -d apache/skywalking-ui:8.6.0

方案二:使用ES作為存儲啟動,适合生産環境

使用 docker-compose部署skywalking的三個基礎服務:ES、OAP、WEB

version: '3'

services:
  es7:
    container_name: es7
    hostname: es7
    image: elasticsearch:7.5.1
    expose:
      - 9200
      - 9300  
    networks:
      - e2e      
    environment:
      - discovery.type=single-node
      
  oap:
    container_name: oap
    hostname: oap  
    image: apache/skywalking-oap-server:8.7.0-es7
    expose:
      - 11800
      - 12800
      - 5005
    networks:
      - e2e
    restart: on-failure
    environment:
      - SW_STORAGE=elasticsearch7
      - SW_STORAGE_ES_CLUSTER_NODES="es7:9200"
    healthcheck:
      test: ["CMD", "sh", "-c", "nc -zn 127.0.0.1 11800"]
      interval: 5s
      timeout: 60s
      retries: 120
    depends_on:
     - "es7"      

  ui:
    image: apache/skywalking-ui:8.7.0
    ports:
      - "8080:8080"
    networks:
      - e2e
    environment:
      - SW_OAP_ADDRESS=http://oap:12800
    depends_on:
     - "oap"   
         
networks:
  e2e:           

Agent端

在springboot項目內建Skywalking Agent

1.解壓apache-skywalking-apm-8.6.0.tar.gz,設定-javaagent:指向解壓後的skywalking-agent.jar位置,不能拷貝出來,因為它會通過這個jar來識别目前config 和 plugin目錄,同時這個jar會依賴日志、跟蹤、名額等相關jar包。

2.先請求springboot服務,請求完後,一定要等一會,點一下右上角重新整理按鈕才有資料,這些資料預設會被儲存3天,可以調整服務端 recordDataTTL 參數

3.服務名稱agent.service_name如果要分組可以命名為:mygroup::myapp,這樣所有服務就自動劃分到mygroup組中

java -javaagent:D:\apache-skywalking-apm-bin\agent\skywalking-agent.jar \

-Dskywalking.agent.service_name=myapp \

-Dskywalking.agent.instance_name=myapp \

-Dskywalking.collector.backend_service=oap:11800 \

-jar myapp.jar

如果是idea,那麼在Edit Configuration 中 VM Option中添加

-javaagent:skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=myapp -Dskywalking.agent.instance_name=myapp -Dskywalking.collector.backend_service=oap:11800

k8s中服務內建Skywalking Agent

在k8s 中 springboot項目內建Skywalking,推薦采用 sidecar形式

# myapp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp  

spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      initContainers:
      # 應用鏡像
      - image: myapp:3.0
        imagePullPolicy: Always
        name: app-container
        command: ["cp", "/myapp.jar", "/app"]
        volumeMounts:
        - mountPath: /app
          name: app-volume
      # skywalking鏡像
      - image: apache/skywalking-java-agent:8.7.0-alpine
        name: agent-container
        command: [ "/bin/sh" ]
        args: [ "-c","cp /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-8.7.0.jar /skywalking/agent/activations/ && cp -R /skywalking/agent /agent/"]
        volumeMounts:
        - name: skywalking-agent
          mountPath: /agent
      containers:
      - name: jre-container
        image: anapsix/alpine-java:8_server-jre_unlimited
        imagePullPolicy: IfNotPresent
        command: ["java","-jar","/usr/local/myapp.jar"]
        args: ["--server.port=9086","--spring.profiles.active=dev"]
        volumeMounts:
        - mountPath: /usr/local
          name: app-volume
        - name: skywalking-agent
          mountPath: /skywalking
        ports:
        - name: container-port
          containerPort: 9086
        env:
        - name: JAVA_TOOL_OPTIONS
          value: "-javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.trace.ignore_path=/eureka/**,SpringScheduled/**,Guav
aCache/**,Jedis/**,PostgreSQL/**"
        # 應用名稱
        - name: SW_AGENT_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.labels['app']
        # oap服務位址
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: "oap:11800"
        #- name: SW_AGENT_TRACE_IGNORE_PATH
        #  value: "/actuator/health/**,/eureka/**,PostgreSQL/**,Jedis/**"
        #- name: SW_MOUNT_FOLDERS
        #  value: "plugins,activations,optional-plugins"

      volumes:
      - name: app-volume
        emptyDir: {}      
      - name: skywalking-agent
        emptyDir: {}

---
#service
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
  - port: 9086
    protocol: TCP
    targetPort: container-port
  selector:
    app: myapp
  type: ClusterIP           

Web前端

整體概覽

淺談Skywalking微服務監控分析

Skywalking UI

服務概覽

Service界面顯示某個服務運作情況,當選擇不同服務時,相應名額也會變化

同一個服務部署在多個節點上,就會形成多個執行個體,這時服務顯示的就是多個執行個體的整體運作情況

目前端點可以檢視目前服務的某個請求的請求狀況

淺談Skywalking微服務監控分析