栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

全链路追踪 skywalking 和 pinpoint

全链路追踪 skywalking 和 pinpoint

背景介绍

     随着业务越来越复杂,企业应用也进入了分布式服务化的阶段,随着模块的不断增多,一次请求可能会涉及到十几个甚至几十个服务的协同处理,那么如何准确快速的定位到线上故障和性能瓶颈,便成为我们不得不面对的棘手问题,传统的日志监控等方式无法很好达到跟踪调用,排查问题等需求。
    目前有很多优秀的分布式链路跟踪系统架构可有效针对以上问题,如skywalking、pinpoint、cat及zipkin等。此文章主要针对 skywalking 和 pinpoint 做技术选型对比,并介绍 skywalking 的部署及简单使用。

技术对比
对比内容pinpointskywalking
依赖Java 6,7,8
maven3+
Hbase0.94+
Java 6,7,8
maven3.0+
nodejs
zookeeper
elasticsearch
实现方式java探针,字节码增强java探针,字节码增强
颗粒度方法级方法级
编程语言Java,PHPJava,C#,PHP,Node.js
页面UI*********
存储选择HbaseElasticsearch,H2,mysql
通信方式ThriftGRPC
MQ监控不支持RocketMq,Kafka
全局调用统计支持支持
Trace查询不支持支持
报警支持支持
JVM监控支持支持
性能损耗
优点完全无侵入, 仅需修改启动方式,界面完善,功能细致。完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。
功能比较完善
缺点不支持查询单个调用链, 对外表现的是整个应用的调用生态。
二次开发难度较高
3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少。
依赖较多
文档文档完善文档完善
开发者Naver吴晟(华为开发者) ,目前已经加入Apache孵化器
使用公司Naver华为,alibaba cloud,天源迪科,当当网,京东金融
skywalking搭建 1. elasticsearch搭建(数据源,elasticsearch和mysql选一种即可)
  • 在Liunx环境下载
wget https://mirrors.huaweicloud.com/elasticsearch/7.10.1/elasticsearch-7.10.1-linux-x86_64.tar.gz 
  • 解压文件
tar -zxvf elasticsearch-7.10.1-linux-x86_64.tar.gz 
  • 赋予文件夹及子文件可执行权限
chmod -R +x elasticsearch-7.10.1
  • 创建elasticsearch启动用户(elasticsearch必须使用非ROOT用户启动)
adduser es
  • 更改文件夹(elasticsearch-7.10.1)的所属用户
chown -R es elasticsearch-7.10.1
  • 赋予用户(es)该文件夹(elasticsearch-7.10.1)的执行权限
chmod -R +x es elasticsearch-7.10.1
  • 切换到config目录文件
cd elasticsearch-7.10.1/config/
  • 编辑 elasticsearch.yml
cluster.name: elasticsearch
node.name: node-1
  • 切换到bin目录文件
cd elasticsearch-7.10.1/bin/
  • 切换用户(es),使用用户(es)后台启动elasticsearch
su es
./elasticsearch -d

  • 访问链接,查看启动效果
curl http://localhost:9200
2. mysql搭建
  • 在Liunx环境下载
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
  • 解压文件
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
  • 修改目录
mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql-5.7.36
  • 赋予文件夹及子文件可执行权限
chmod -R +x mysql-5.7.36
  • 添加系统mysql组和mysql用户
groupadd mysql
useradd -r -g mysql mysql
  • 创建data 和 tmp目录并赋权
cd mysql-5.7.36/
mkdir data tmp
chmod -R +x data tmp
  • 配置mysql服务
cp support-files/mysql.server /etc/init.d/mysql
  • 修改mysql服务
vi /etc/init.d/mysql

  • 修改配置文件my.cnf
vi /etc/my.cnf

拷贝内容如下,按需调整参数

[mysqld]
#skip-name-resolve
#skip-external-locking
skip-external-locking       
#shared-memory

# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/dev/mysql/mysql-5.7.36
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/dev/mysql/mysql-5.7.36/data
#指定临时文件目录
tmpdir=/usr/local/dev/mysql/mysql-5.7.36/tmp
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

#跳过密码验证
skip-grant-tables

user=mysql
  • 初始化mysql服务
--initialize--user=mysql --basedir=/usr/local/dev/mysql/mysql-5.7.36 --datadir=/usr/local/dev/mysql/mysql-5.7.36/data
  • 启动服务
service mysql start
  • 修改mysql密码
mysql -u root -p
mysql> use mysql
mysql> update user set Update_priv='Y' where user='root';  #这时候我们需要给root以更新的权限
mysql> update user set Grant_priv ='Y' where user ='root';   #然后是设置权限的权限
mysql> flush privileges;   #刷新权限
mysql> grant all privileges on *.* to root@'localhost' identified by "123" with grant option;   #123是密码
mysql> flush privileges;
  • 修改配置文件关闭跳过密码验证
vi /etc/my.cnf
#跳过密码验证
#skip-grant-tables
  • 重启mysql,创建数据库
service mysql restart  #重启服务
mysql -u root -p      #连接mysql
Enter password:
mysql> create database swtest;  #skywalking需要连接的库名
3. skywalking 部署
  • 在Liunx环境下载
wget https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-es7-8.2.0.tar.gz
  • 解压文件
tar -zxvf apache-skywalking-apm-es7-8.1.0.tar.gz
  • 赋予文件夹及子文件可执行权限
chmod -R +x apache-skywalking-apm-bin-es7
  • 更改文件所属用户组为root 若是默认为root则略过此步骤
chown -R root apache-skywalking-apm-bin-es7
chgrp root apache-skywalking-apm-bin-es7
  • 切换config目录文件
cd apache-skywalking-apm-bin-es7/config
  • 编辑 application.yml 文件
#以elasticsearch7做存储
storage:
  selector: ${SW_STORAGE:elasticsearch7}

  elasticsearch7:
    nameSpace: ${SW_NAMESPACE:"elasticsearch"}  #同elasticsearch的cluster.name一致
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} #elasticsearch服务器ip:post

#以mysql做存储
storage:
  selector: ${SW_STORAGE:mysql}
 
  mysql:
  properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://192.168.27.129:3306/swtest?useSSL=false"}
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:123}
      dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
      dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
      dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
      dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
    metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
    maxSizeOfArrayColumn: ${SW_STORAGE_MAX_SIZE_OF_ARRAY_COLUMN:20}
    numOfSearchablevaluesPerTag: ${SW_STORAGE_NUM_OF_SEARCHABLE_VALUES_PER_TAG:2}

若是以mysql做存储需要下载mysql驱动包(5.1.48)到 /usr/local/dev/skywalking/apache-skywalking-apm-bin-es7/oap-libs/ 目录下

  • 编辑 webapp.yml 文件
vi apache-skywalking-apm-bin-es7/webapp/webapp.yml
server:
  port: 8080   #可修改访问端口(避免端口冲突)
  • 启动skywalking
    .oapServiceNoInit.sh:单独启动后台
    .webappService.sh:单独启动前台
    .startup.sh:前后一起启动
./apache-skywalking-apm-bin-es7/bin/startup.sh
  • 查看skywalking监控页面 链接为配置的(skywalking部署服务器的映射ip)ip:post 默认:127.0.0.1:8080
4. 探针配置(Agent)

多个监控应用分别将skywalking目录下agent复制至被监听同级目录,并配置修改项目名字、日志打印级别、skywalking的服务地址等配置

agent/config/agent.config配置示例

# 命名空间,用于隔离跨进程传播的header。如果进行了配置,header将为HeaderName:Namespa
agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}

# 展示界面中现实服务名称
agent.service_name=${SW_AGENT_NAME:emr-server}

# 鉴权是否开启取决于后端的配置,可查看application.yml的详细描述。对于大多数的场景,需要后端对鉴权进行扩展。目前仅实现了基本的鉴权功能。
# agent.authentication = ${SW_AGENT_AUTHENTICATION:xxxx}
 
# 单个线段中的最大跨距量。
# 通过这个配置项,SkyWalking可以估计应用程序内存开销。
# agent.span_limit_per_segment=${SW_AGENT_SPAN_LIMIT:150}
 
# 如果为true,则SkyWalking代理将在“/debugging”文件夹中保存所有检测到的类文件。
# SkyWalking可能会要求这些文件,以解决兼容问题。
# agent.is_open_debugging_class = ${SW_AGENT_OPEN_DEBUG:true}
 
# 如果为true,SkyWalking代理将把所有检测到的类文件缓存到内存或磁盘文件中(由类缓存模式决定),
# 允许其他javaagent增强那些由SkyWalking agent增强的类。
# agent.is_cache_enhanced_class = ${SW_AGENT_CACHE_CLASS:false}
 
# 插入指令的类缓存模式:内存或文件
# 内存:将类字节缓存到内存中,如果插入指令的类太多或太大,则可能会占用更多内存
# 文件:在“/class cache”文件夹中缓存类字节,当应用程序退出时自动清理缓存的类文件
# agent.class_cache_mode = ${SW_AGENT_CLASS_CACHE_MODE:MEMORY}
 
# 操作名称最大长度
# 注意,在目前的实践中,我们不建议长度超过190。
# agent.operation_name_threshold=${SW_AGENT_OPERATION_NAME_THRESHOLD:150}
 
# The agent use gRPC plain text in default.
# If true, SkyWalking agent uses TLS even no CA file detected.
# agent.force_tls=${SW_AGENT_FORCE_TLS:false}
 
# 如果为true,则当用户创建新的配置文件任务时,skywalking代理将启用配置文件。否则禁用配置文件。
# profile.active=${SW_AGENT_PROFILE_ACTIVE:true}
 
# 并行监视器段计数
# profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5}
 
# 最大监视段时间(分钟),如果当前段监视时间超出限制,则停止它。
# profile.duration=${SW_AGENT_PROFILE_DURATION:10}
 
# 最大转储线程堆栈深度
# profile.dump_max_stack_depth=${SW_AGENT_PROFILE_DUMP_MAX_STACK_DEPTH:500}
 
# 快照传输到后端缓冲区的大小
# profile.snapshot_transport_buffer_size=${SW_AGENT_PROFILE_SNAPSHOT_TRANSPORT_BUFFER_SIZE:0}
 
# skywalking后端服务地址。
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.27.129:11800}

# 日志文件名
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api-emrServer.log}

# 日志记录级别
logging.level=${SW_LOGGING_LEVEL:INFO}

# 日志文件存储目录
# logging.dir=${SW_LOGGING_DIR:""}

# 日志文件最大值, default: 300 * 1024 * 1024 = 314572800
# logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:314572800}

# 最大历史记录日志文件。当发生滚动时,如果日志文件超过这个数字,
# 然后删除最旧的文件。默认情况下,负数或零表示禁用。
# 如果不限制个数可能到只日志文件过大,磁盘爆满
# logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:-1}

# 忽略异常,有些异常属于业务需要,不用在sw中标示出来
# statuscheck.ignored_exceptions=${SW_STATUSCHECK_IGNORED_EXCEPTIONS:}
 
# 异常链路的跟踪深度,最好不要高于10,对性能有影响
# statuscheck.max_recursive_depth=${SW_STATUSCHECK_MAX_RECURSIVE_DEPTH:1}

# 增加agent下特定文件夹下的支持插件
plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations,bootstrap-plugins}

# 不加载某些支持插件,名称参考Plugin-list.md
plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:dubbo,motan}

# 忽略指定后缀的请求收集
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}

# 每3秒的采样率,负数代表100%
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}

# 是否获取mysql操作sql的参数
# plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:false}

# Kafka producer configuration
# plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

# 跟踪Spring中的bean,需要耗费更多的资源
plugin.springannotation.classname_match_regex=${SW_SPRINGANNOTATION_CLASSNAME_MATCH_REGEX:}
  1. 基于Tomcat的服务(SpringMvc)

在tomcat的bin目录下的catalina.sh首行增加如下命令行,例如:

--Tomcat7 添加如下命令
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/project/project/agent/skywalking-agent.jar"
export CATALINA_OPTS

--Tomcat8添加如下命令
set JAVA_OPT = -javaagent:usr/local/project/project/agent/skywalking-agent.jar
  1. 基于JAR file的服务(SpringBoot)

在启动应用程序命令行中添加参数,并确保在-jar参数之前添加它,例如:

java -javaagent:/usr/local/project/emr_server/agent/skywalking-agent.jar -Dskywalking.agent.service_name=emr-server  -Dskywalking.collector.backend_service=192.168.27.129:11800  -jar emr_server/hiop.emr.server-1.1.0.jar
  1. NodeJs接入skywalking

安装 nodejs module

npm install skyapm-nodejs@latest --save

app.js内添加初始化代码

require('skyapm-nodejs').start({
    // 应用名称
    serviceName: 'hiop-web',
    // Skywalking后端暴露的agent_gRPC/grpc service地址
    directServers: '192.168.27.129:11800'
});

如果对本篇文章有什么意见或建议,欢迎在评论区交流。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434107.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号