文章目录
前言
随着公司业务的扩张,系统变得日趋复杂,越来越多的业务组件开始走向分布式,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。复杂的网络也导致的一些问题的发生,我们需要思考下这些问题:
- 1、 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位这个问题发生在那个地方?
- 2、如何计算每个节点访问流量?
- 3、流量波动的时候,该如何动态增加相应节点的集群服务?
如果想要解决这些问题,一定要有足够数据来进行支撑,绝不是靠开发人员或者运维人员的直觉来判断。为了解决分布式应用、微服务系统面临的这些挑战,
APM(Application Performance Management,应用性能管理)
便应运而生。
APM
可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是
APM
。谷歌的
Google Dapper
是一个比较早期的
APM系统
,给谷歌的开发人员和运维团队帮了大忙,谷歌在2010年公开发表论文分享了
Dapper
。而后,很多的技术公司基于这篇论文的原理,设计开发了很多出色的
APM框架
,例如
Zipkin
、
Pinpoint
、
SkyWalking
、
Jaeger
等。
**
APM
主要有三个方面的内容,分别是
Logs(日志)
、
Traces(链路追踪)
和
Metrics(报表统计)
。关于
APM
其他内容这里就不继续进行展开介绍,下面的内容主要是关于链路追踪系统
Skywalking
。**
Skywalking简介
Skywalking
是一款基于
OpenTracing APM
规范的国产开源分布式链路追踪系统,由国内开源爱好者吴晟在2015年开源并于2017年时提交到Apache孵化器,它同时借鉴吸收了
Zipkin
、
Pinpoint
、
CAT
的设计思路。
Skywalking支持dubbo,SpringCloud,SpringBoot集成,代码无侵入,通信方式采用GRPC,性能较好,实现方式是java探针,支持告警,支持JVM监控,支持全局调用统计等等,功能较完善。
Skywalking支持
Java
、
.Net
、
NodeJs
、
Go
、
Python
等探针,并且支持与
Dubbo,SpringCloud,SpringBoot
集成,与
Pinpoint
一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生与容器平台有较好支持。数据存储支持
Mysql
、
Elasticsearch
等。
Skywalking官方的两张架构图
Skywalking 的三个组成部分
- 探针(agent)
负责进行数据的收集,包含了
Tracing
和
Metrics
的数据,agent会被安装到服务所在的服务器上,以方便数据的获取。探针使用gRPC协议与OAP平台通信并上报数据。
- 可观测性分析平台 OAP(Observability Analysis Platform)
接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如
Elasticsearch
、
MySQL
等存储服务。同时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中提供了
Tracing
和
Metrics
数据的获取和聚合
- 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
sudocurl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudochmod 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安装
- docker hub仓库地址:https://registry.hub.docker.com/r/apache/skywalking-oap-server
- docker-compose.yaml
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中
,value1
是P50
的阈值,value2
是P75
的阈值,那么-,-
,value3, value4, value5
的意思是,没有阈值的P50
和P7
5的警规则。 - 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 in3 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% in2 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的使用会在下一篇文章中介绍。
版权归原作者 初夏的微风 所有, 如有侵权,请联系我们删除。