Skywalking安装部署


前言

  随着公司业务的扩张,系统变得日趋复杂,越来越多的业务组件开始走向分布式,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。复杂的网络也导致的一些问题的发生,我们需要思考下这些问题:

  • 1、 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位这个问题发生在那个地方?
  • 2、如何计算每个节点访问流量?
  • 3、流量波动的时候,该如何动态增加相应节点的集群服务?

  如果想要解决这些问题,一定要有足够数据来进行支撑,绝不是靠开发人员或者运维人员的直觉来判断。为了解决分布式应用、微服务系统面临的这些挑战,APM(Application Performance Management,应用性能管理)便应运而生。

  APM可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是APM。谷歌的Google Dapper是一个比较早期的APM系统,给谷歌的开发人员和运维团队帮了大忙,谷歌在2010年公开发表论文分享了Dapper。而后,很多的技术公司基于这篇论文的原理,设计开发了很多出色的APM框架,例如ZipkinPinpointSkyWalkingJaeger等。

APM主要有三个方面的内容,分别是 Logs(日志)Traces(链路追踪)Metrics(报表统计)。关于APM其他内容这里就不继续进行展开介绍,下面的内容主要是关于链路追踪系统 Skywalking


Skywalking简介

  Skywalking是一款基于OpenTracing APM规范的国产开源分布式链路追踪系统,由国内开源爱好者吴晟在2015年开源并于2017年时提交到Apache孵化器,它同时借鉴吸收了ZipkinPinpointCAT的设计思路。

Skywalking支持dubbo,SpringCloud,SpringBoot集成,代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计等等,功能较完善。

  Skywalking支持Java.NetNodeJsGoPython等探针,并且支持与Dubbo,SpringCloud,SpringBoot集成,与Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生与容器平台有较好支持。数据存储支持MysqlElasticsearch等。

Skywalking官方的两张架构图

Skywalking 的三个组成部分

  • 探针(agent)

负责进行数据的收集,包含了TracingMetrics的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。探针使用gRPC协议与OAP平台通信并上报数据。

  • 可观测性分析平台 OAP(Observability Analysis Platform)

接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如 ElasticsearchMySQL等存储服务。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。OAP默认监听两个端口gRPC协议端口11800、HTTP端口12800,gRPC用于探针上报数据,HTTP端口用于UI连接OAP平台获取数据。

  • Skywalking UI

Skywalking 提供单独的UI进行数据的查看,UI调用OAP提供的接口,获取对应的数据根据UI模板的配置进行展示。Skywalking UI与OAP之间使用Http协议进行通信。Skywalking UI默认监听8080端口提供Web服务。

在Skywalking中提供了TracingMetrics数据的获取和聚合

  • Metric

Metric 它的特点是可累加的,具有原子性,每个都是一个逻辑计量单元,或者一个时间段内的柱状图。 例如:队列的当前深度可以被定义为一个计量单元,在写入或读取时被更新统计; 输入HTTP请求的数量可以被定义为一个计数器,用于简单累加; 请求的执行时间可以被定义为一个柱状图,在指定时间片上更新和统计汇总。

  • Tracing

Tracing 的最大特点是它在单次请求的范围内处理信息。 任何的数据、元数据信息都被绑定到系统中的单个事务上。 例如:一次调用远程服务的RPC执行过程;一次实际的SQL查询语句; 一次HTTP请求的业务性ID。

总结,Metric主要用来进行数据的统计,比如HTTP请求数的计算。Tracing主要包含了某一次请求的链路数据。

在SkyWalking中也存在服务、服务实例及端点概念

  • 服务(Service)

对请求提供端点的单个应用或负载,在使用埋点代理SDK 的时候,你可以定义服务的名字。如果不定义的话,SkyWalking 会使用在agent.conf中配置的默认服务名称。

  • 端点(Endpoint)

端点就是服务对外提供的接口与特定服务所接收的请求路径,如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。

  • 实例(Instance)

在每个服务中都是唯一的。运行的服务都是一个实例。就像 Kubernetes 中的 pods 一样,服务实例未必就是操作系统上的一个进程。但当你在使用代理的时候, 一个服务实例实际就是操作系统上的一个真实进程。

官网地址https://skywalking.apache.org/

Skywalking 部署

部署环境

  • 操作系统:CentOS 7
  • Java JDK::1.8
  • docker:20
  • docker-compose:1.29
  • elasticsearch: 7.16

软件版本

  • SKywalking-oap : 8.9.1
  • Java-agent :8.9.0
  • Nginx-lua :0.6.0

安装docker

  为了方便快速部署这里选择使用Docker运行ElasticSearch 7,请先安装docker-ce和docker-compose,如果已安装docker请跳过。

安装docker

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce

启动docker

sudo systemctl enable docker 
sudo systemctl start docker 

创建一个虚拟网络用于挂载容器,使所用容器使用统一的网络,方便容器之间的调用。

sudo docker network create docker

安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod a+x /usr/local/bin/docker-compose

存储服务

  在部署Skywalking之前需要先部署数据存储服务,我们这是使用ElasticSearch 7 作为Skywalking的后端存储,Skywalking 在生产环境中最常用的存储服务。如果Skywalking是用于演示、开发,可以选择H2存储,H2内置在Skywalking中无需配置外部存储。

Skywalking目前原生支持的存储:

  • H2
  • ElasticSearch
  • MySQL
  • TiDB
  • InfluxDB
  • Postgresql
  • iotdb

安装ElasticSearch 7

docker-compose.yaml 文件

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.16.3
    container_name: elasticsearch
    restart: always
    ports:
      - 9200:9200
    environment:
      - "TAKE_FILE_OWNERSHIP=true" 			# 变量存在则挂载目录的属主为容器内运行es进程的用户。
      - "discovery.type=single-node" 		# 单机模式启动
      - "TZ=Asia/Shanghai" 					# 设置时区
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" 	# 设置jvm内存大小
    volumes:
      - ./logs:/usr/share/elasticsearch/logs
      - ./data:/usr/share/elasticsearch/data
    ulimits:								# 设置容器ulimits
      memlock:
        soft: -1
        hard: -1
networks:
  default:
    external:
      name: docker

运行容器ElasticSearch 7 容器

docker-compose up -d

OAP Server 部署

  Skywalking 官方提供了编译好的压缩包和docker镜像,可以按照自己的实际情况和需求进行选择按照,我下面会将两种安装方式都写出来。

Skywalking 安装包部署

安装包下载地址:https://dlcdn.apache.org/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz

1、将安装包下载到安装目录并进行解压。

cd /data/server
wget https://dlcdn.apache.org/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz
tar -xvf apache-skywalking-apm-8.9.1.tar.gz
mv apache-skywalking-apm-bin apache-skywalking
rm -rf apache-skywalking-apm-8.9.1.tar.gz

2、目录结构

├── bin								# 运行脚本
│   ├── oapService.bat
│   ├── oapServiceInit.bat
│   ├── oapServiceInit.sh			# 初始化启动脚本,用于集群环境。为了防止多节点同时启动导致冲突,
									# 单节点执行oapServiceInit.sh进行初始化,其他节点执行oapServiceNoInit.sh等待初始化完成后再启动。
│   ├── oapServiceNoInit.bat
│   ├── oapServiceNoInit.sh
│   ├── oapService.sh				# OAP 启动并初始化
│   ├── startup.bat
│   ├── startup.sh					# 启动并初始化脚本(同时启动OAP与UI)
│   ├── webappService.bat
│   └── webappService.sh			# Skywalking UI 启动脚本
├── config							# 配置文件
│   ├── alarm-settings.yml			# 告警配置
│   ├── application.yml				# OAP 主配置文件
│   ├── component-libraries.yml		# 组件库配置,定义被监控应用中使用的组件库
│   ├── endpoint-name-grouping.yml	# 接口名称分组规则
│   ├── envoy-metrics-rules			# envoy 网关监控策略
│   │   ├── envoy-svc-relation.yaml
│   │   └── envoy.yaml
│   ├── fetcher-prom-rules			# Prometheus Fetcher 配置文件,用于OAP自监测。
│   │   └── self.yaml
│   ├── gateways.yml				# 网关配置,单节点无需配置
│   ├── lal
│   │   ├── default.yaml
│   │   └── envoy-als.yaml
│   ├── log4j2.xml					# 日志配置
│   ├── log-mal-rules
│   │   └── placeholder.yaml
│   ├── metadata-service-mapping.yaml
│   ├── meter-analyzer-config
│   │   └── spring-sleuth.yaml
│   ├── oal							# oal监控度量指标
│   │   ├── browser.oal
│   │   ├── core.oal
│   │   ├── disable.oal
│   │   ├── dotnet-agent.oal
│   │   ├── event.oal
│   │   ├── java-agent.oal
│   │   └── tcp.oal
│   ├── openapi-definitions		 	
│   │   └── serviceA
│   ├── otel-oc-rules				# OpenTelemetry receiver规则
│   │   ├── istio-controlplane.yaml
│   │   ├── k8s-cluster.yaml
│   │   ├── k8s-node.yaml
│   │   ├── k8s-service.yaml
│   │   ├── oap.yaml
│   │   └── vm.yaml
│   ├── service-apdex-threshold.yml	# apdex配置
│   ├── trace-sampling-policy-settings.yml	# 采样配置
│   ├── ui-initialized-templates	# UI配置模板
│   │   ├── apm.yml
│   │   ├── browser.yml
│   │   ├── database.yml
│   │   ├── event.yml
│   │   ├── istio-dp.yml
│   │   ├── istio.yml
│   │   ├── k8s.yml
│   │   ├── self-observability.yml
│   │   ├── spring-sleuth.yml
│   │   ├── topology-endpoint-relation.yml
│   │   ├── topology-endpoint.yml
│   │   ├── topology-instance.yml
│   │   ├── topology-service-instance-relation.yml
│   │   ├── topology-service-relation.yml
│   │   ├── topology-service.yml
│   │   └── vm.yml
│   └── zabbix-rules			# zabbix 规则
│       └── agent.yaml
├── config-examples						# 配置文件示例
│   ├── alarm-settings.yml
│   ├── lal.yaml
│   └── log-mal.yaml
├── LICENSE
├── licenses
├── NOTICE
├── oap-libs							# OAP Jar文件与依赖库
├── README.txt
├── tools								# 开发运维工具
│   └── profile-exporter
│       ├── application.yml
│       ├── profile_exporter_log4j2.xml
│       └── profile_exporter.sh
└── webapp								# Skywalking UI
    ├── skywalking-webapp.jar
    └── webapp.yml						# Skywalking UI 配置文件

3、修改主配置文件 application.yml

由于配置文件内容过多,下面只列出了部分配置。

  • 集群配置
cluster:									# 集群配置,单节点无需修改
  selector: ${SW_CLUSTER:standalone}		# 单节点默认即可	
  standalone:
  • 核心配置
core:
  selector: ${SW_CORE:default}
  default:
    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
    # Receiver: Receive agent data, Level 1 aggregate
    # Aggregator: Level 2 aggregate
    role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
    restHost: ${SW_CORE_REST_HOST:0.0.0.0}				# Skywalking HTTP监听地址
    restPort: ${SW_CORE_REST_PORT:12800}				# 数据端口HTTP
    restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
    restMinThreads: ${SW_CORE_REST_JETTY_MIN_THREADS:1}
    restMaxThreads: ${SW_CORE_REST_JETTY_MAX_THREADS:200}
    restIdleTimeOut: ${SW_CORE_REST_JETTY_IDLE_TIMEOUT:30000}
    restAcceptorPriorityDelta: ${SW_CORE_REST_JETTY_DELTA:0}
    restAcceptQueueSize: ${SW_CORE_REST_JETTY_QUEUE_SIZE:0}
    httpMaxRequestHeaderSize: ${SW_CORE_HTTP_MAX_REQUEST_HEADER_SIZE:8192}
    gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}					# 监控地址 gRPC	
    gRPCPort: ${SW_CORE_GRPC_PORT:11800}					# 数据接收端口 gRPC
    maxConcurrentCallsPerConnection: ${SW_CORE_GRPC_MAX_CONCURRENT_CALL:0}
    maxMessageSize: ${SW_CORE_GRPC_MAX_MESSAGE_SIZE:0}
    gRPCThreadPoolQueueSize: ${SW_CORE_GRPC_POOL_QUEUE_SIZE:-1}
    gRPCThreadPoolSize: ${SW_CORE_GRPC_THREAD_POOL_SIZE:-1}
    gRPCSslEnabled: ${SW_CORE_GRPC_SSL_ENABLED:false}
    gRPCSslKeyPath: ${SW_CORE_GRPC_SSL_KEY_PATH:""}
    gRPCSslCertChainPath: ${SW_CORE_GRPC_SSL_CERT_CHAIN_PATH:""}
    gRPCSslTrustedCAPath: ${SW_CORE_GRPC_SSL_TRUSTED_CA_PATH:""}
    downsampling:
      - Hour
      - Day
    # Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted.
    enableDataKeeperExecutor: ${SW_CORE_ENABLE_DATA_KEEPER_EXECUTOR:true} # Turn it off then automatically metrics data delete will be close.
    dataKeeperExecutePeriod: ${SW_CORE_DATA_KEEPER_EXECUTE_PERIOD:5} # How often the data keeper executor runs periodically, unit is minute
    recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day				# 明细记录数据有效期
    metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day				# 监控指标数据有效期
    # The period of L1 aggregation flush to L2 aggregation. Unit is ms.
    l1FlushPeriod: ${SW_CORE_L1_AGGREGATION_FLUSH_PERIOD:500}
    # The threshold of session time. Unit is ms. Default value is 70s.
    storageSessionTimeout: ${SW_CORE_STORAGE_SESSION_TIMEOUT:70000}
  • 存储配置,下面只列出了es的配置项
storage:
  selector: ${SW_STORAGE:elasticsearch}			# 存储类型,默认是H2,需要修改为要使用的elasticsearch
  elasticsearch:
    namespace: ${SW_NAMESPACE:"CollectorDBCluster"}	# 命名空间,默认为空,用于隔离数据这里配置的参数会作为es 索引的前缀。
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}			# es端口
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}						# 连接es的协议
    connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:500}
    socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
    numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
    user: ${SW_ES_USER:""}												# es用户名,如果es没有配置认证无需填写
    password: ${SW_ES_PASSWORD:""}										# es密码
    trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
    trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
    secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool.
    dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:1} # Replicas number of new indexes
    # Super data set has been defined in the codes, such as trace segments.The following 3 config would be improve es performance when storage super size data in es.
    superDatasetDayStep: ${SW_SUPERDATASET_STORAGE_DAY_STEP:-1} # Represent the number of days in the super size dataset record index, the default value is the same as dayStep when the value is less than 0
    superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} #  This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
    superDatasetIndexReplicasNumber: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_REPLICAS_NUMBER:0} # Represent the replicas number in the super size dataset record index, the default value is 0.
    indexTemplateOrder: ${SW_STORAGE_ES_INDEX_TEMPLATE_ORDER:0} # the order of index template
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:5000} # Execute the async bulk record data every ${SW_STORAGE_ES_BULK_ACTIONS} requests
    # flush the bulk every 10 seconds whatever the number of requests
    # INT(flushInterval * 2/3) would be used for index refresh period.
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:15}
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
    profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
    oapAnalyzer: ${SW_STORAGE_ES_OAP_ANALYZER:"{\"analyzer\":{\"oap_analyzer\":{\"type\":\"stop\"}}}"} # the oap analyzer.
    oapLogAnalyzer: ${SW_STORAGE_ES_OAP_LOG_ANALYZER:"{\"analyzer\":{\"oap_log_analyzer\":{\"type\":\"standard\"}}}"} # the oap log analyzer. It could be customized by the ES analyzer configuration to support more language log formats, such as Chinese log, Japanese log and etc.
    advanced: ${SW_STORAGE_ES_ADVANCED:""}

4、修改Skywalking UI配置 webapp.yml ,文件在webapp目录中

server:
  port: 8080							# UI的监听端口

spring:
  cloud:
    gateway:							# 网关配置,单节点无需修改
      routes:
        - id: oap-route
          uri: lb://oap-service
          predicates:
            - Path=/graphql/**
    discovery:
      client:
        simple:
          instances:
            oap-service:
              - uri: http://127.0.0.1:12800	# Skywalking OAP的http 地址和端口,默认127.0.0.1:12800,如果你的IP和端口修改过,这个也需要配置修改后的地址和端口。
            # - uri: http://<oap-host-1>:<oap-port1>
            # - uri: http://<oap-host-2>:<oap-port2>

  mvc:
    throw-exception-if-no-handler-found: true

  web:
    resources:
      add-mappings: true

management:
  server:
    base-path: /manage

5、启动并初始化Skywalking

bin/startup.sh 

启动完成后会在生成三个日志文件,oap的主要日志信息输出再skywalking-oap-server.log中

  • oap.log
  • skywalking-oap-server.log
  • webapp-console.log

docker安装

version: '3.3'
services:
  skywalking-oap-server:
    image: apache/skywalking-oap-server:8.9.1
    container_name: skywalking-oap-server
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch  # 指定ES版本
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      SW_NAMESPACE: CollectorDBCluster
      TZ: Asia/Shanghai
    volumes:
     - ./oap/conf/alarm-settings.yml:/skywalking/config/alarm-settings.yml
  skywalking-ui:
    image: apache/skywalking-ui:8.9.1
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap-server
    links:
      - skywalking-oap-server
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: http://skywalking-oap-server:12800
      TZ: Asia/Shanghai
networks:
  default:
    external:
      name: docker
docker-compose up -d

客户端接入

Java-agent接入

下载客户端安装包

将安装包下载到服务所在的服务器上

cd /data/server/
wget https://dlcdn.apache.org/skywalking/java-agent/8.9.0/apache-skywalking-java-agent-8.9.0.tgz
tar -xvf apache-skywalking-java-agent-8.9.0.tgz
cd skywalking-agent

目录结构

├── activations								# 工具包,默认加载。
├── bootstrap-plugins						# 启动插件,默认加载。
├── config									# 配置文件
│   └── agent.config
├── LICENSE
├── licenses
├── logs
├── NOTICE
├── optional-plugins						# 可选扩展插件,启动不加载,如需加载将其移到到plugins目录下。
├── optional-reporter-plugins				# 可选统计类插件,启动不加载。
├── plugins									# 服务类插件
└── skywalking-agent.jar					# 客户端主程序,需要被服务启动是引用。

配置文件

常用配置项

agent.namespace=${SW_AGENT_NAMESPACE:}				# 命名空间,可通过此参数实现数据隔离
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# SkywalkingUI 中展示的服务名,如果是微服务架构,可以和注册中心中的应用名一致,配置文件中无需配置,通过探针加载应用名。

agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}		# 每3秒,收集 TraceSegment的条数。
agent.is_cache_enhanced_class=${SW_AGENT_CACHE_CLASS:true}	
# 如果为true,则SkyWalking代理会将所有检测到的类文件缓存到内存或磁盘文件中(由类缓存模式决定)

agent.class_cache_mode=${SW_AGENT_CLASS_CACHE_MODE:MEMORY}	# 插入指令的类缓存模式:内存或文件
agent.instance_name=${SW_AGENT_INSTANCE_NAME:}				# 实例名称,不配置默认生成一个64位的uuid。

collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}		# OAP的地址

plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations}	# 加载插件目录

plugin.jdbc.trace_sql_parameters=${SW_JDBC_TRACE_SQL_PARAMETERS:true}	# 获取JDBC SQL 请求参数,默认flase,开启会对性能有些影响。
plugin.jdbc.sql_parameters_max_length=${SW_PLUGIN_JDBC_SQL_PARAMETERS_MAX_LENGTH:512}		# JDBC 参数的获取最大长度。
plugin.jdbc.sql_body_max_length=${SW_PLUGIN_JDBC_SQL_BODY_MAX_LENGTH:2048}	# JDBC sql语句最大长度

plugin.tomcat.collect_http_params=${SW_PLUGIN_TOMCAT_COLLECT_HTTP_PARAMS:false}		# 是否获取tomcat http请求参数
plugin.springmvc.collect_http_params=${SW_PLUGIN_SPRINGMVC_COLLECT_HTTP_PARAMS:false}
plugin.httpclient.collect_http_params=${SW_PLUGIN_HTTPCLIENT_COLLECT_HTTP_PARAMS:true}	# 获取http请求参数
plugin.http.http_params_length_threshold=${SW_PLUGIN_HTTP_HTTP_PARAMS_LENGTH_THRESHOLD:1024}	# http请求参数长度
plugin.http.http_headers_length_threshold=${SW_PLUGIN_HTTP_HTTP_HEADERS_LENGTH_THRESHOLD:2048} # http headers请求长度
plugin.http.include_http_headers=${SW_PLUGIN_HTTP_INCLUDE_HTTP_HEADERS:}
plugin.dubbo.collect_consumer_arguments=${SW_PLUGIN_DUBBO_COLLECT_CONSUMER_ARGUMENTS:true}	# 获取duboo 消费者参数
plugin.dubbo.consumer_arguments_length_threshold=${SW_PLUGIN_DUBBO_CONSUMER_ARGUMENTS_LENGTH_THRESHOLD:256}
plugin.dubbo.collect_provider_arguments=${SW_PLUGIN_DUBBO_COLLECT_PROVIDER_ARGUMENTS:true}	# 获取duboo 提供者参数
plugin.dubbo.provider_arguments_length_threshold=${SW_PLUGIN_DUBBO_PROVIDER_ARGUMENTS_LENGTH_THRESHOLD:256}

配置接入

我们这里使用探针方式进行接入

  • 格式1:
-javaagent:/path/to/skywalking-agent.jar={config1}={value1},{config2}={value2}
  • 格式2:
-Dskywalking.[option1]=[value2]

推荐使用格式1

  • 接入示例
JAVA_OPTS="-Xms256m -Xmx1024m  -Dundertow.host=0.0.0.0 -javaagent:/data/server/skywalking-agent/skywalking-agent.jar=agent.service_name=sap-sp,agent.instance_name=192.168.14.18
  • 配置优先级:探针 > JVM配置 > 系统环境变量 > agent.config
  • 一些通用配置参数可以配置在agent.conf文件中,服务个性化参数如服务名称等,可以通过探针参数传递。

端点过滤

在项目中有些端点是我们不想被Skywalking监控的,这时我们可以使用Skywalking的端点过滤插件。

将过滤插件复制到plugin目录下

cd /data/server/skywalking-agent
cp optional-plugins/apm-trace-ignore-plugin-8.9.0.jar plugins/

config目录下创建apm-trace-ignore-plugin.config配置文件

vim config/apm-trace-ignore-plugin.config

配置内容

trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:Jedis/**,HikariCP/Connection/getConnection}

参数也可以通过探针的方式进行配置

JAVA_OPTS="-javaagent:/data/server/skywalking-agent/skywalking-agent.jar=trace.ignore_path=Jedis/**,HikariCP/Connection/getConnection"

接入完成后启动项目,过几分钟就可以在Skywalking UI中看到数据。

Nginx-lua接入

  Skywalking采集Nginx的agent插件是基于lua来编写的,所以要追踪采集Nginx,需要Nginx支持lua模块。默认情况下Nginx不支持Lua模块,需要安装LuaJIT解释器,并且重新编译Nginx,或者也可以使用国人开源的基于Nginx的openrestry来作为Web服务。

下载Skywalking Nignx-lua包

cd /data/server/
wget https://github.com/apache/skywalking-nginx-lua/archive/refs/tags/v0.6.0.tar.gz
tar -xvf v0.6.0.tar.gz
mv skywalking-nginx-lua-0.6.0/ skywalking-nginx-lua

目录结构

├── CHANGES.md
├── examples					# nginx配置示例
│   └── nginx.conf
├── lib							# lua脚本
│   ├── resty
│   └── skywalking
├── LICENSE
├── licenses
├── Makefile
├── mvnw
├── NOTICE
├── README.md
├── release.md
├── rockspec
├── t
└── test	# 测试文件

Nginx 接入

修改nginx.conf配置文件,将下面这段配置添加到http

    lua_package_path "/data/server/skywalking-nginx-lua/lib/?.lua;;";	# 引用lua脚本
    lua_shared_dict tracing_buffer 100m;		# 定义一个共享内存,大小为100m。

	# 当master进程被启动后,每个worker进程都会执行下列Lua代码。如果Nginx禁用了master进程,init_by_lua*将会直接运行。
    init_worker_by_lua_block {
        local metadata_buffer = ngx.shared.tracing_buffer
		-- 定义在Skywalking UI中显示的服务名
        metadata_buffer:set('serviceName', 'Nginx')
		-- 设置实例名称
        metadata_buffer:set('serviceInstanceName', 'User Service Instance Name')
        -- 是否在EntrySpan中标记主机名或域
        metadata_buffer:set('includeHostInEntrySpan', true)

        -- set randomseed
        require("skywalking.util").set_randomseed()
		-- OAP 地址和端口
        require("skywalking.client"):startBackendTimer("http://127.0.0.1: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配置,在server 内加入下面这段配置

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

        log_by_lua_block {
            skywalking_tracer:prepareForReport()
        }

重载Nignx配置 ,就可以看到数据

Skywalking 告警通知

  Skywalking发送告警的基本原理是每隔一段时间去轮询skywalking-oap收集到的链路追踪的数据,再根据配置的相关告警规则(如服务响应时间、服务响应时间百分比)来判断是否达到阈值,达到则发送相应的告警信息。

  Skywalking 发送告警信息是以线程池异步的方式调用webhook接口完成的,具体使用的webhook接口可以由使用者自行定义,告警的相关信息也可以在Skywalking UI中进行查看。

  Skywalking的告警规则定义在config/alarm-settings.yml文件中。使用的度量名定义在config/oal目录中的oal结尾的文件中。

目前支持的告警接口如下:

  • 普通 webhook
  • gRPCHook
  • Slack Chat Hook
  • WeChat Hook(微信告警)
  • Dingtalk Hook(钉钉告警)
  • Feishu Hook(飞书告警)

告警规则编写

告警规则有两种类型,单独规则(Individual Rules)和复合规则(Composite Rules),复合规则是单独规则的组合。

单独规则(Individual Rules)

配置项:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • metrics-name:度量名称,默认配置中可以用于告警的度量有:服务,实例,端点,服务关系,实例关系,端点关系。它只支持long,double和int类型。
  • include-names:包含在此规则之内的实体名称列表。
  • exclude-names:排除在此规则以外的实体名称列表。
  • include-names-regex:提供一个正则表达式来包含实体名称。如果同时设置包含名称列表和包含名称的正则表达式,则两个规则都将生效。
  • exclude-names-regex:提供一个正则表达式来排除实体名称。如果同时设置排除名称列表和排除名称的正则表达式,则两个规则都将生效。
  • include-labels:包含在此规则之内的标签。
  • exclude-labels:排除在此规则以外的标签。
  • include-labels-regex:提供一个正则表达式来包含标签。如果同时设置包含标签列表和包含标签的正则表达式,则两个规则都将生效。
  • exclude-labels-regex:提供一个正则表达式来排除标签。如果同时设置排除标签列表和排除标签的正则表达式,则两个规则都将生效。

标签的设置必须把数据存储在meter-system中,例如:Prometheus, Micrometer。以上四个标签设置必须实现LabeledValueHolder接口。

  • threshold:阈值。 对于多个值的指标,例如percentile,阈值是一个数组。像value1 value2 value3 value4 value5这样描述。如果不想通过此值或某些值触发警报,则将值设置为-,例如在percentile中value1P50的阈值,value2P75的阈值,那么-,-value3, value4, value5的意思是,没有阈值的P50P75的警规则。
  • op:操作符,支持>, >=, <, <=, =
  • period:度量检测的时间长度。
  • count:在period时间窗口内,达到多少次阀值即触发告警。
  • only-as-condition:true或false,设置规则是否可以发送告警或者仅作为复合规则的条件。
  • silence-period:告警通道静默期,默认情况下与period相同,表示在静默期时间内,同样的告警只会触发一次。
  • message:告警消息

示例:

rules:
  service_resp_time_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.
  service_sla_rule:
    # Metrics value need to be long, double or int
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    # The length of time to evaluate the metrics
    period: 10
    # How many times after the metrics match the condition, will trigger alarm
    count: 2
    # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
    silence-period: 3
    message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes

复合规则(Composite Rules)

复合规则仅适用于针对相同实体级别的告警规则,例如都是服务级别或都是端点级别的的告警规则。

复合规则:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • expression:指定如何组成规则,支持&&, ||, ()操作符。
  • message:该规则触发时,发送的通知消息。

示例:

rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%
composite-rules:
  comp_rule:
    expression: service_resp_time_rule && service_sla_rule
    message: 服务【{name}】在最近10分钟内有2分钟超过1秒平均响应时间超过1秒并且成功率低于80%

WebHook

dingtalk hook配置示例:

dingtalkHooks:
  textTemplate: |-
    {
      "msgtype": "text",
      "text": {
        "content": "Apache SkyWalking 告警: \n %s."
      }
    }
  webhooks:
    - url: https://oapi.dingtalk.com/robot/send?access_token=your_token
      secret: your_secret

告警的消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,JSON 格式包含以下信息:

  • scopeId:目标 Scope 的 ID。
  • name:目标 Scope 的实体名称。
  • id0:Scope 实体的 ID。
  • id1:未使用。
  • ruleName:您在 alarm-settings.yml 中配置的规则名。
  • alarmMessage:告警消息内容。
  • startTime. 告警时间戳,当前时间与 UTC 1970/1/1 相差的毫秒数。

示例:

[{
	"scopeId": 1, 
	"scope": "SERVICE",
	"name": "test-service", 
	"id0": "b3JkZXItY2VudGVyLXNlYXJjaC1hcGk=.1",  
	"id1": "",  
    "ruleName": "service_resp_time_rule",
	"alarmMessage": "服务【test-service】的平均响应时间在最近10分钟内有2分钟超过1秒",
	"startTime": 1647244975000
}]

关于Skywalking UI的使用会在下一篇文章中介绍。

  • 8
    点赞
  • 20
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

初夏的微风

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值