最近在看分布式性能监控,调用追踪功能的系统。看了网上各位大佬的分析,选择了skywalking。
为啥选它:适合当前的需求,无侵入,粒度正好知足需求,性能消耗低
一:介绍java
基本信息
SkyWalking:是一个APM(应用程序性能监视器)系统,专门为微服务,云原生和基于容器(Docker,Kubernetes,Mesos)的体系结构而设计,包括针对Cloud Native体系结构中的分布式系统的监视,跟踪,诊断功能。
其核心功能以下。mysql
性能好:针对单实例5000tps的应用,在全量采集的状况下,只增长 10% 的CPU开销
支持多语言探针
支持自动及手动探针:其中手动探针经过OpenTrackingApi、@Trace注解、trackId集成到日志中。web
2.架构 sql
SkyWalking主要由三大部分组成:Agent(探针),Collector(收集器),Web;数据库
Agent:做用是使用JavaAgent字节码加强技术将Agent的代码织入程序中,完成Agent无代码侵入地获取程序内方法的上下文并进行加强和收集信息并发送给Collector;与Collector进行心跳,代表Agent客户端的存活。
Collector:做用是维护存活的Agent实例,并收集从Agent发送至Collector的数据,进行处理及持久化;
web:做用是将Collector收集的参数进行不一样维度的展现
二:使用
1:下载SkyWalking后解压,目录以下(6.4版本):
agent:探针工具里面包含可支持的插件,探针的配置等,里面文件目录不可改变
config:收集器配置
wabapp:webui配置
2:配置修改
不修改任何配置可直接启动,默认单节点,如想修改配置或集群:
application.yml 收集器配置文件修改
collector的集群我是拷贝了一份skywalking项目,而后修改通讯端口apache
cluster: # 单节点模式 standalone: # zk用于管理collector集群协做. # zookeeper: # 多个zk链接地址用逗号分隔. # hostPort: localhost:2181 # sessionTimeout: 100000 # 分布式 kv 存储设施,相似于zk,但没有zk重型(除了etcd,consul、Nacos等都是相似功能) # etcd: # serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} # 多个节点用逗号分隔, 如: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 # hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379} core: default: # 混合角色:接收代理数据,1级聚合、2级聚合 # 接收者:接收代理数据,1级聚合点 # 聚合器:2级聚合点 role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator # rest 服务地址和端口 restHost: ${SW_CORE_REST_HOST:localhost} restPort: ${SW_CORE_REST_PORT:12800} restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/} # gRPC 服务地址和端口 gRPCHost: ${SW_CORE_GRPC_HOST:localhost} gRPCPort: ${SW_CORE_GRPC_PORT:11800} downsampling: - Hour - Day - Month # 设置度量数据的超时。超时过时后,度量数据将自动删除. # 单位分钟 recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:90} # 单位分钟 minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:90} # 单位小时 hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:36} # 单位天 dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:45} # 单位月 monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:18} storage: elasticsearch: # elasticsearch 的集群名称 nameSpace: ${SW_NAMESPACE:"local-ES"} # elasticsearch 集群节点的地址及端口 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.2.10:9200} # elasticsearch 的用户名和密码 user: ${SW_ES_USER:""} password: ${SW_ES_PASSWORD:""} # 设置 elasticsearch 索引分片数量 indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} # 设置 elasticsearch 索引副本数 indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} # 批量处理配置 # 每2000个请求执行一次批量 bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # 每 20mb 刷新一次内存块 bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # 不管请求的数量如何,每10秒刷新一次堆 flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # 并发请求的数量 concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # elasticsearch 查询的最大数量 metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} # elasticsearch 查询段最大数量 segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} mysql: properties: jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://127.0.0.1:3306/skywalking"} dataSource.user: ${SW_DATA_SOURCE_USER:root} dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root} ... #使用mysql时,我是把datasource-settings.properties里的配置拷贝到这儿。引入的方式遇到问题没找到没有解决。 metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
修改\webapp\webapp.ymlwindows
server: #访问端口 port: 8080 collector: path: /graphql ribbon: ReadTimeout: 10000 # 指向全部后台的restHost:restPort,若是集群了,分割 listOfServers: 127.0.0.1:12800,127.0.0.1:12801
\agent\config\agent.config性能优化
# 服务名指定,多服务状况下经过传参的方式来指定,后面说 agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} # 后台收集器地址 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800,127.0.0.1:11801}
alarm-settings.yml 告警规则配置文件服务器
#发送告警到指定的服务器地址 webhooks #http://127.0.0.1/notify/ #http://127.0.0.1/go-wechat/
3.启动
windows下直接启动bin下startup.bat,可启动一个collector和一个webui,集群下模式,我是再启动拷贝项的oapService.bat。collector和webui也启动了
启动项目session
java -javaagent:D:\\project\\apache-skywalking-apm-bin\\agent\\skywalking-agent.jar -Dskywalking.agent.service_name=service-product -jar service-product.jar
-javaagent:#标识后面是一个代理工具
D:\project\apache-skywalking-apm-bin\agent\skywalking-agent.jar :#探针jar的位置
-Dskywalking.agent.service_name:#给参数赋值,传入启动的项目名为:service-product
进入webapp.yml指定的port
三:总结
看到界面内容很丰富,要学习东西仍是挺多的,好比,如何指定监控规则,如何过滤出须要发送到邮件或钉钉的日志等,这些均可之后续在实际项目中经过需求来作
出现错误,必定查看logs文件下日志,过程当中也遇到了不少问题。因为当时没有记录下来,映像比较深的有:
配置es后,es启动正常,启动Collector报错,日志提示用要存入数据到es须要指定类型什么的,大体这样的
"caused\_by": { "type": "x\_content\_parse\_exception", "reason": "\[5:9\] \[alias\_action\] failed to parse field \[remove\]"
,大概意思是入库数据格式有误,mapping没法解析,用的es7.,说7.不支持,降版本吧,下了6.8,也不支持,换了6.5后能够了。collector不能自动发现agent的,注意要先启动collector。若是单节点collector挂了再启动,就搜集不到agent了。这个问题还没搞懂。因此建议作collector集群