对java、scala
- QQ
群 : 624054633 - Email: leviqian@sina.com
- blog: blog
- APP:
接 入 skyeye-client的 系 统会通 过kafkaAppender向 kafka写 入日 志 - es-indexer-group: kafka
的 es消 费组,读取kafka的 数 据 并批量 bulk到 es - monitor-group: kafka
的 监控消 费组,app在日 志 中 进行各 种event埋 点 (如:第 三 方 异常报警、请求耗时异常报警等 ) - business-group: kafka
的 业务消 费组 - trace-group:
通 过日志 进行rpc调用trace跟踪(dapper论文) - es:
日 志 存 储db,并建立 相 关索引 - zookeeper: app
注 册 中心 - monitor: 监控
中心 ,监听zookeeper注 册 中 心中 相 应的节点变化进行监控报警 - rabbitmq: 监控报警缓冲队列
- alert:
具体 报警手段 ,包括 邮件和 微 信
对java、scala
日 志 实时采 集 (支持 log4j、logback和 log4j2)日 志 实时页面实时展示 (支持 关键字 过滤)- 历史
日 志 查询(支持 多 种条件 过滤,支持 sql语句查询) - app实时
部署 位置 展示 (机 器 和文 件 夹) - app实时
日 志 采 集 状 态展示 - app历史
部署 位置 展示 - api请求实时统计
和 历史统计 第 三方请求实时统计和历史统计基 于dubbox的 rpc调用数 据 收集 和 调用链展示 (支持 多 种条件 检索)系 统上下 线报警系 统内嵌 采 集 器 报警中 间件、api、第 三 方 、job执行异常报警(策略 报警和 异常报警)
PS: rancher
sudo bash build.sh 1.3.0 master
该项
该项
该项
该项
该项
该项
git clone https://github.com/JThink/dubbox.git
cd dubbox
git checkout skyeye-trace-1.3.0
修 改 相 关pom中 的 私服 地 址
mvn clean install deploy -Dmaven.test.skip=true
如果软件
软件 |
备注 | |
---|---|---|
mysql | 5.5+ | |
elasticsearch | 2.3.3 | |
kafka | 0.10.0.1 | 如果spark |
jdk | 1.7+ | |
zookeeper | 3.4.6 | |
rabbitmq | 3.5.7 | |
hbase | 1.0.0-cdh5.4.0 | |
gradle | 3.0+ | |
hadoop | 2.6.0-cdh5.4.0 | |
spark | 1.3.0-cdh5.4.0 | |
redis | 3.x | 单机 |
mysql -uroot -p
source skyeye-data/skyeye-data-jpa/src/main/resources/sql/init.sql
创建
hbase shell
执行skyeye-collector/skyeye-collector-trace/src/main/resources/shell/hbase这个文 件 里 面 的 内容
cd skyeye-collector/skyeye-collector-indexer/src/main/resources/shell
./install.sh
bash start.sh app-log http://192.168.xx.xx:9200,http://192.168.xx.xx:9200,......
cd skyeye-collector/skyeye-collector-metrics/src/main/resources/shell
bash start.sh event-log http://192.168.xx.xx:9200,http://192.168.xx.xx:9200,......
注意 点 :如果es版本 为5.x,那 么需要 修 改 skyeye-collector/src/main/resources/shell/es/app-log/create-index.py的 49和 50行 为下面 内容 :
'messageSmart': { 'type': 'text', 'analyzer': 'ik_smart', 'search_analyzer': 'ik_smart', 'include_in_all': 'true', 'boost': 8},
'messageMax': { 'type': 'text', 'analyzer': 'ik_max_word', 'search_analyzer': 'ik_max_word', 'include_in_all': 'true', 'boost': 8}
创建
kafka-topics.sh --create --zookeeper 192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181/kafka/0.10.0.1 --replication-factor 3 --partitions 9 --topic app-log
./zkCli.sh
执行skyeye-monitor/src/main/resources/shell/zk这个文 件 里 面 的 内容
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/alarm
vim alarm.properties
# log_mailer request queue
rabbit.request.addresses=localhost:5672
rabbit.request.username=jthink
rabbit.request.password=jthink
rabbit.request.vhost=/dev
rabbit.request.channelCacheSize=50
rabbit.request.queue=log_mailer
rabbit.request.exchange=direct.log
rabbit.request.routingKey=log.key
# mail
mail.jthink.smtphost=smtp.xxx.com
mail.jthink.port=25
mail.jthink.from=xxx@xxx.com
mail.jthink.cc=xxx@xxx.com
mail.jthink.password=jthink_0926
cd skyeye-alarm
gradle clean distZip -x test
cd target/distributions
unzip skyeye-alarm-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-alarm-x.x.x
nohup bin/skyeye-alarm &
- skyeye-collector-core:
收集 项目的 所有 公用 的 配置 和 公用 代 码,改 module不 需要 部署 - skyeye-collector-backup: 对采
集 的 所有 日 志 进行备份 - skyeye-collector-indexer: 对采
集 的 所有 日 志 进行索引 存 入 es - kyeye-collector-metrics: 对
事件 日 志 进行meta data的 采 集 和 相 关报警metrics进行索引 存 入 es - skyeye-collector-trace: 对rpc跟踪
数 据 进行采 集 入 hbase
cd skyeye-collector
gradle clean build -x test
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/collector
vim collector-backup.properties
# kafka config
kafka.brokers=riot01:9092,riot02:9092,riot03:9092
kafka.topic=app-log
kafka.consume.group=log-backup-consume-group
kafka.poll.timeout=100
# hdfs
hadoop.hdfs.namenode.port=8020
hadoop.hdfs.namenode.host=192.168.88.131
hadoop.hdfs.user=xxx
hadoop.hdfs.baseDir=/user/xxx/JThink/
hadoop.hdfs.fileRoot=/tmp/monitor-center/
upload.log.cron=0 30 0 * * ?
cd skyeye-collector-backup/target/distributions
unzip skyeye-collector-backup-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-collector-backup-x.x.x
nohup bin/skyeye-collector-backup &
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/collector
vim collector-indexer.properties
# kafka config
kafka.brokers=riot01:9092,riot02:9092,riot03:9092
kafka.topic=app-log
kafka.consume.group=es-indexer-consume-group
kafka.poll.timeout=100
# es config
es.ips=riot01,riot02,riot03
es.cluster=mondeo
es.port=9300
es.sniff=true
es.index=app-log
es.doc=log
cd skyeye-collector-indexer/target/distributions
unzip skyeye-collector-indexer-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-collector-indexer-x.x.x
nohup bin/skyeye-collector-indexer &
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/collector
vim collector-metrics.properties
# kafka config
kafka.brokers=riot01:9092,riot02:9092,riot03:9092
kafka.topic=app-log
kafka.consume.group=info-collect-consume-group
kafka.poll.timeout=100
# es config
es.ips=riot01,riot02,riot03
es.cluster=mondeo
es.port=9300
es.sniff=true
es.index=event-log
es.doc=log
# redis config
redis.host=localhost
redis.port=6379
redis.password=
# mysql config
database.address=localhost:3306
database.name=monitor-center
database.username=root
database.password=root
# log_mailer request queue
rabbit.request.addresses=localhost:5672
rabbit.request.username=jthink
rabbit.request.password=jthink
rabbit.request.vhost=/dev
rabbit.request.channelCacheSize=50
rabbit.request.queue=log_mailer
rabbit.request.exchange=direct.log
rabbit.request.routingKey=log.key
# zk
zookeeper.zkServers=riot01:2181,riot02:2181,riot03:2181
zookeeper.sessionTimeout=60000
zookeeper.connectionTimeout=5000
cd skyeye-collector-metrics/target/distributions
unzip skyeye-collector-metrics-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-collector-metrics-x.x.x
nohup bin/skyeye-collector-metrics &
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/collector
vim collector-trace.properties
# kafka config
kafka.brokers=riot01:9092,riot02:9092,riot03:9092
kafka.topic=app-log
kafka.consume.group=rpc-trace-consume-group
kafka.poll.timeout=100
# redis config
redis.host=localhost
redis.port=6379
redis.password=
# mysql config
database.address=localhost:3306
database.name=monitor-center
database.username=root
database.password=root
# hbase config
hbase.quorum=panda-01,panda-01,panda-03
hbase.rootDir=hdfs://panda-01:8020/hbase
hbase.zookeeper.znode.parent=/hbase
cd skyeye-collector-trace/target/distributions
unzip skyeye-collectortracemetrics-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-collector-trace-x.x.x
nohup bin/skyeye-collector-trace &
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/monitor
vim monitor.properties
# zk
zookeeper.zkServers=riot01:2181,riot02:2181,riot03:2181
zookeeper.sessionTimeout=60000
zookeeper.connectionTimeout=5000
zookeeper.baseSleepTimeMs=1000
zookeeper.maxRetries=3
# log_mailer request queue
rabbit.request.addresses=localhost:5672
rabbit.request.username=jthink
rabbit.request.password=jthink
rabbit.request.vhost=/dev
rabbit.request.channelCacheSize=50
rabbit.request.queue=log_mailer
rabbit.request.exchange=direct.log
rabbit.request.routingKey=log.key
# mysql config
database.address=localhost:3306
database.name=monitor-center
database.username=root
database.password=root
cd skyeye-monitor
gradle clean distZip -x test
cd target/distributions
unzip skyeye-monitor-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-monitor-x.x.x
nohup bin/skyeye-monitor &
ssh 到 部署 节点
mkdir -p /opt/jthink/jthink-config/skyeye/web
vim web.properties
# server
serverAddress=0.0.0.0
serverPort=8090
# mysql config
database.address=localhost:3306
database.name=monitor-center
database.username=root
database.password=root
# es sql url
es.sql.url=http://riot01:9200/_sql?sql=
es.sql.sql=select * from app-log/log
es.query.delay=10
es.sql.index.event=event-log/log
# log_mailer request queue
rabbit.request.addresses=localhost:5672
rabbit.request.username=jthink
rabbit.request.password=jthink
rabbit.request.vhost=/dev
rabbit.request.channelCacheSize=50
rabbit.request.queue=log_mailer
rabbit.request.exchange=direct.log
rabbit.request.routingKey=log.key
# monitor
monitor.es.interval=0 */1 * * * ? # 监控代 码执行 的 周期 ,建 议不修 改
monitor.es.mail=leviqian@sina.com
# hbase config
hbase.quorum=panda-01,panda-01,panda-03
hbase.rootDir=hdfs://panda-01:8020/hbase
hbase.zookeeper.znode.parent=/hbase
cd skyeye-web
gradle clean distZip -x test
cd target/distributions
unzip skyeye-web-x.x.x.zip(替 换相应的x为自己 的 版本 )
cd skyeye-web-x.x.x
nohup bin/skyeye-web &
gradle
compile "skyeye:skyeye-client-logback:1.3.0"
<property name="APP_NAME" value="your-app-name" />
<!-- kafka appender -->
<appender name="kafkaAppender" class="com.jthink.skyeye.client.logback.appender.KafkaAppender">
<encoder class="com.jthink.skyeye.client.logback.encoder.KafkaLayoutEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS};${CONTEXT_NAME};HOSTNAME;%thread;%-5level;%logger{96};%line;%msg%n</pattern>
</layout>
</encoder>
<topic>app-log</topic>
<rpc>none</rpc>
<zkServers>riot01.jthink.com:2181,riot02.jthink.com:2181,riot03.jthink.com:2181</zkServers>
<mail>xxx@xxx.com</mail>
<keyBuilder class="com.jthink.skyeye.client.logback.builder.AppHostKeyBuilder" />
<config>bootstrap.servers=riot01.jthink.com:9092,riot02.jthink.com:9092,riot03.jthink.com:9092</config>
<config>acks=0</config>
<config>linger.ms=100</config>
<config>max.block.ms=5000</config>
</appender>
gradle
compile "skyeye:skyeye-client-log4j:1.3.0"
<appender name="kafkaAppender" class="com.jthink.skyeye.client.log4j.appender.KafkaAppender">
<param name="topic" value="app-log"/>
<param name="zkServers" value="riot01.jthink.com:2181,riot02.jthink.com:2181,riot03.jthink.com:2181"/>
<param name="app" value="xxx"/>
<param name="rpc" value="dubbo"/>
<param name="mail" value="xxx@xxx.com"/>
<param name="bootstrapServers" value="riot01.jthink.com:9092,riot02.jthink.com:9092,riot03.jthink.com:9092"/>
<param name="acks" value="0"/>
<param name="maxBlockMs" value="2000"/>
<param name="lingerMs" value="100"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS};APP_NAME;HOSTNAME;%t;%p;%c;%L;%m%n"/>
</layout>
</appender>
gradle
compile "skyeye:skyeye-client-log4j2:1.3.0"
<KafkaCustomize name="KafkaCustomize" topic="app-log" zkServers="riot01.jthink.com:2181,riot02.jthink.com:2181,riot03.jthink.com:2181"
mail="qianjc@unionpaysmart.com" rpc="none" app="${APP_NAME}">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS};${APP_NAME};HOSTNAME;%t;%-5level;%logger{96};%line;%msg%n"/>
<Property name="bootstrap.servers">riot01.jthink.com:9092,riot02.jthink.com:9092,riot03.jthink.com:9092</Property>
<Property name="acks">0</Property>
<Property name="linger.ms">100</Property>
</KafkaCustomize>
- logback
在 对接kafka的 时候有 个bug,jira bug,所以 需要 将 root level设置为INFO(不能 是 DEBUG)
compile "com.101tec:zkclient:0.10"
compile ("com.alibaba:dubbo:2.8.4-skyeye-trace-1.3.0") {
exclude group: 'org.springframework', module: 'spring'
}
如果项目
http://blog.csdn.net/jthink_/article/details/52513963
http://blog.csdn.net/jthink_/article/details/52613953
http://blog.csdn.net/jthink_/article/details/73106745
说明 | |
---|---|
normal | |
invoke_interface | api调用 |
middleware_opt | |
job_execute | job执行 |
rpc_trace | rpc trace跟踪 |
custom_log | |
thirdparty_call |
LOGGER.info("我 是 测试日 志 打 印 ")
// 参 数 依 次 为EventType(事件 类型)、api、账号、请求耗时、成功 还是失 败、具体 自 定 义的日 志 内容
LOGGER.info(ApiLog.buildApiLog(EventType.invoke_interface, "/app/status", "800001", 100, EventLog.MONITOR_STATUS_SUCCESS, "我 是 mock api成功 日 志 ").toString());
LOGGER.info(ApiLog.buildApiLog(EventType.invoke_interface, "/app/status", "800001", 10, EventLog.MONITOR_STATUS_FAILED, "我 是 mock api失 败日志 ").toString());
// 参 数 依 次 为EventType(事件 类型)、MiddleWare(中 间件名称 )、操作 耗时、成功 还是失 败、具体 自 定 义的日 志 内容
LOGGER.info(EventLog.buildEventLog(EventType.middleware_opt, MiddleWare.HBASE.symbol(), 100, EventLog.MONITOR_STATUS_SUCCESS, "我 是 mock middle ware成功 日 志 ").toString());
LOGGER.info(EventLog.buildEventLog(EventType.middleware_opt, MiddleWare.MONGO.symbol(), 10, EventLog.MONITOR_STATUS_FAILED, "我 是 mock middle ware失 败日志 ").toString());
// job执行仅仅处理失 败的日 志 (成功 的 不 做处理 ,所以 只 需要 构造失 败的日 志 ), 参 数 依 次 为EventType(事件 类型)、job 的 id号 、操作 耗时、失 败、具体 自 定 义的日 志 内容
LOGGER.info(EventLog.buildEventLog(EventType.job_execute, "application_1477705439920_0544", 10, EventLog.MONITOR_STATUS_FAILED, "我 是 mock job exec失 败日志 ").toString());
// 参 数 依 次 为EventType(事件 类型)、第 三 方 名称 、操作 耗时、成功 还是失 败、具体 自 定 义的日 志 内容
LOGGER.info(EventLog.buildEventLog(EventType.thirdparty_call, "xx1", 100, EventLog.MONITOR_STATUS_FAILED, "我 是 mock third 失 败日志 ").toString());
LOGGER.info(EventLog.buildEventLog(EventType.thirdparty_call, "xx1", 100, EventLog.MONITOR_STATUS_SUCCESS, "我 是 mock third 成功 日 志 ").toString());
LOGGER.info(EventLog.buildEventLog(EventType.thirdparty_call, "xx2", 100, EventLog.MONITOR_STATUS_SUCCESS, "我 是 mock third 成功 日 志 ").toString());
LOGGER.info(EventLog.buildEventLog(EventType.thirdparty_call, "xx2", 100, EventLog.MONITOR_STATUS_FAILED, "我 是 mock third 失 败日志 ").toString());