本文将配合 Rancher 1.6 讲解如何搭建并配置日志错误上报框架 Sentry 及网站统计分析框架 matomo 的搭建及接入 vue(本文以 iview-admin 为例)项目。
背景简述
sentry 项目运行过程中,难免出现 bug,前端不像后端可以很方便的采集项目日志(比如,log4j + elk),导致每次出问题后还原车祸现场费时费力。另外,随着 vue 等框架的兴起,构建项目时打成 min.js,无疑又加大了前端定位问题的难度。而 sentry 是一款专注于错误采集的框架,支持常见的主流语言(如下图所示):
可以采集,聚合,并推送错误信息。注意,sentry 并不是日志平台(e.g. log4j + elk),也不是监控平台,sentry 专注于项目中的 Error 信息的采集,聚合,报警。
matomo 的前身是 Pwiki,这是一款开源的 web 网站分析利器。类似于 Google Analytics。其具体的特性,参见 Premium Web Analytics ,比如绘制页面热力图,录制会话,访问漏斗,A/B Test 等(这几样都是收费插件功能)。
注意:本文假设你已经有 rancher1.6 的环境
安 装
matomo
rancher 创建 matomo
在 rancher 主机上
## 创建必要文件夹
mkdir -p /data/matomo/{config,logs,php,maxmind}/
## 安装maxmind ip数据库
wget -P /tmp/ https://github.com/maxmind/geoipupdate/releases/download/v4.0.3/geoipupdate_4.0.3_linux_amd64.deb
dpkg -i /tmp/geoipupdate_4.0.3_linux_amd64.deb
mv /etc/GeoIP.conf{,.bak}
cat << EOF | sudo tee -a /etc/GeoIP.conf
AccountID 0
LicenseKey 000000000000
EditionIDs GeoLite2-Country GeoLite2-City GeoLite2-ASN
DatabaseDirectory /data/matomo/maxmind
EOF
## 下载最新maxmind数据库
geoipupdate
ls -lah /data/matomo/maxmind/
总用量 67M
drwxr-xr-x 2 root root 4.0K 7月 7 17:25 .
drwxr-xr-x 6 root root 4.0K 7月 7 17:23 ..
-rw------- 1 root root 0 7月 7 17:25 .geoipupdate.lock
-rw-r--r-- 1 root root 6.3M 7月 7 17:25 GeoLite2-ASN.mmdb
-rw-r--r-- 1 root root 57M 7月 7 17:25 GeoLite2-City.mmdb
-rw-r--r-- 1 root root 3.7M 7月 7 17:25 GeoLite2-Country.mmdb
## 定时更新ip数据库
cat << EOF | sudo tee -a /etc/cron.d/geoipupdate
50 2 * * 4 root /usr/bin/geoipupdate
EOF
## 设置php.ini
cat << EOF | sudo tee -a /data/matomo/php/php.ini
upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 200
memory_limit = 256M
EOF
docker-compose.yaml
version: '2'
services:
matomo:
image: matomo:latest
stdin_open: true
volumes:
- /data/matomo/config:/var/www/html/config
- /data/matomo/logs:/var/www/html/logs
- /data/matomo/php/php.ini:/usr/local/etc/php/php.ini
- /data/matomo/maxmind/GeoLite2-City.mmdb:/var/www/html/misc/GeoLite2-City.mmdb
- /data/matomo/maxmind/GeoLite2-Country.mmdb:/var/www/html/misc/GeoLite2-Country.mmdb
- /data/matomo/maxmind/GeoLite2-ASN.mmdb:/var/www/html/misc/GeoLite2-ASN.mmdb
tty: true
ports:
- 80:80/tcp
- 443:443/tcp
rancher-compose.yaml
version: '2'
services:
matomo:
scale: 1
start_on_create: true
health_check:
response_timeout: 2000
healthy_threshold: 2
port: 80
unhealthy_threshold: 3
initializing_timeout: 60000
interval: 2000
strategy: recreate
reinitializing_timeout: 60000
配置 matomo
选择中文
系统检查
配置数据库
自动建表完成
创建管理员用户
设置分析网站(可以随便创建,后边再进行修改),注意跟进实际情况修改时区
复制跟踪代码
配置 matomo
登录
Sentry
rancher 创建 Sentry
docker-compose.yml
version: '2'
services:
cron:
image: sentry:9
environment:
SENTRY_MEMCACHED_HOST: memcached
SENTRY_REDIS_HOST: redis
SENTRY_POSTGRES_HOST: postgres
SENTRY_EMAIL_HOST: smtp
SENTRY_SECRET_KEY: SENTRY_SECRET_KEY_XXX
stdin_open: true
volumes:
- /data/sentry-data:/var/lib/sentry/files
- /data/sentry-data/config.yml:/etc/sentry/config.yml
tty: true
command:
- run
- cron
memcached:
image: memcached:1.5-alpine
web:
image: sentry:9
environment:
SENTRY_MEMCACHED_HOST: memcached
SENTRY_REDIS_HOST: redis
SENTRY_POSTGRES_HOST: postgres
SENTRY_EMAIL_HOST: smtp
SENTRY_SECRET_KEY: SENTRY_SECRET_KEY_XXX
stdin_open: true
volumes:
- /data/sentry-data:/var/lib/sentry/files
- /data/sentry-data/config.yml:/etc/sentry/config.yml
tty: true
ports:
- 9000:9000/tcp
worker:
image: sentry:9
environment:
SENTRY_MEMCACHED_HOST: memcached
SENTRY_REDIS_HOST: redis
SENTRY_POSTGRES_HOST: postgres
SENTRY_EMAIL_HOST: smtp
SENTRY_SECRET_KEY: SENTRY_SECRET_KEY_XXX
stdin_open: true
volumes:
- /data/sentry-data:/var/lib/sentry/files
- /data/sentry-data/config.yml:/etc/sentry/config.yml
tty: true
command:
- run
- worker
redis:
image: redis:3.2-alpine
postgres:
restart: unless-stopped
image: postgres:9.5
volumes:
- /data/postgresql/data:/var/lib/postgresql/data
ports:
- 5432:5432/tcp
注意把 SENTRY_SECRET_KEY 换成 sentry 的实际 secret key
rancher-compose.yml
version: '2'
services:
cron:
scale: 1
start_on_create: true
memcached:
scale: 1
start_on_create: true
web:
scale: 1
start_on_create: true
health_check:
response_timeout: 2000
healthy_threshold: 2
port: 9000
unhealthy_threshold: 3
initializing_timeout: 60000
interval: 2000
strategy: recreate
reinitializing_timeout: 60000
worker:
scale: 1
start_on_create: true
redis:
scale: 1
start_on_create: true
postgres:
scale: 1
start_on_create: true
health_check:
response_timeout: 2000
healthy_threshold: 2
port: 5432
unhealthy_threshold: 3
initializing_timeout: 60000
interval: 2000
strategy: recreate
reinitializing_timeout: 60000
先将 docker-compose.yml 保存到服务器上,用来初始化 db 和创建账号
docker-compose run --rm web upgrade
Would you like to create a user account now? [Y/n]: y
Email: anjia0532@gmail.com
Password:
Repeat for confirmation:
Should this user be a superuser? [y/N]: y
## 直到输出
Migrated:
- sentry
- sentry.nodestore
- sentry.search
- social_auth
- sentry.tagstore
- sentry_plugins.hipchat_ac
- sentry_plugins.jira_ac
Creating missing DSNs
Correcting Group.num_comments counter
## 并退出
配置 Sentry
配置 vue
如开头所提及的,本文以 iview-admin 为例进行讲解
git clone https://gitee.com/anjia/iview-admin.git
cd iview-admin
sentry
注意,网上很多文档,以讹传讹的使用过时的工具,raven-js .从 5.x 后官方建议使用 @sentry/browser 和 @sentry/integrations
npm install --save @sentry/integrations
npm install --save @sentry/browser
修改 iview-admin\src\main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import iView from 'iview'
import i18n from '@/locale'
import config from '@/config'
import importDirective from '@/directive'
import { directive as clickOutside } from 'v-click-outside-x'
import installPlugin from '@/plugin'
import './index.less'
import '@/assets/icons/iconfont.css'
import TreeTable from 'tree-table-vue'
import VOrgTree from 'v-org-tree'
import 'v-org-tree/dist/v-org-tree.css'
import * as Sentry from '@sentry/browser';
import * as Integrations from '@sentry/integrations';
// 实际打包时应该不引入mock
/* eslint-disable */
if (process.env.NODE_ENV !== 'production') require('@/mock')
Vue.use(iView, {
i18n: (key, value) => i18n.t(key, value)
})
Vue.use(TreeTable)
Vue.use(VOrgTree)
/**
* @description 注册admin内置插件
*/
installPlugin(Vue)
/**
* @description 生产环境关掉提示
*/
Vue.config.productionTip = false
/**
* @description 全局注册应用配置
*/
Vue.prototype.$config = config
/**
* 注册指令
*/
importDirective(Vue)
Vue.directive('clickOutside', clickOutside)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
i18n,
store,
render: h => h(App)
})
Sentry.init({
dsn: 'https://xxx@xxx.xxx.com/xxx',
integrations: [
new Integrations.Vue({
Vue,
attachProps: true,
}),
],
});
npm install
npm run dev
打开 http://localhost:8080/error_store/error_store_page
分别点击两个按钮,模拟出错
打开 sentry 发现已经有错误上报了,并且对错误进行聚合。
点开查看详细内容。
如果需要生成 source-map ,请参考官方文档:
https://docs.sentry.io/platforms/javascript/sourcemaps/
matomo
npm install --save vue-matomo
修改 iview-admin\src\main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import iView from 'iview'
import i18n from '@/locale'
import config from '@/config'
import importDirective from '@/directive'
import { directive as clickOutside } from 'v-click-outside-x'
import installPlugin from '@/plugin'
import './index.less'
import '@/assets/icons/iconfont.css'
import TreeTable from 'tree-table-vue'
import VOrgTree from 'v-org-tree'
import 'v-org-tree/dist/v-org-tree.css'
import * as Sentry from '@sentry/browser'
import * as Integrations from '@sentry/integrations'
import VueMatomo from 'vue-matomo'
// 实际打包时应该不引入mock
/* eslint-disable */
if (process.env.NODE_ENV !== 'production') require('@/mock')
Vue.use(iView, {
i18n: (key, value) => i18n.t(key, value)
})
Vue.use(TreeTable)
Vue.use(VOrgTree)
/**
* @description 注册admin内置插件
*/
installPlugin(Vue)
/**
* @description 生产环境关掉提示
*/
Vue.config.productionTip = false
/**
* @description 全局注册应用配置
*/
Vue.prototype.$config = config
/**
* 注册指令
*/
importDirective(Vue)
Vue.directive('clickOutside', clickOutside)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
i18n,
store,
render: h => h(App)
})
Sentry.init({
dsn: 'https://xxx@xxx.xxx.com/xxx',
integrations: [
new Integrations.Vue({
Vue,
attachProps: true,
}),
],
});
Vue.use(VueMatomo, {
// Configure your matomo server and site by providing
host: '//xxxx.xxxx.com/',
siteId: xx,
// Changes the default .js and .php endpoint's filename
// Default: 'piwik'
trackerFileName: 'matomo.js',
// Overrides the autogenerated tracker endpoint entirely
// Default: undefined
trackerUrl: '//xxxx.xxxx.com/matomo.php',
// Enables automatically registering pageviews on the router
router: router,
// Enables link tracking on regular links. Note that this won't
// work for routing links (ie. internal Vue router links)
// Default: true
enableLinkTracking: true,
// Require consent before sending tracking information to matomo
// Default: false
requireConsent: false,
// Whether to track the initial page view
// Default: true
trackInitialView: true,
// Whether or not to log debug information
// Default: false
debug: false
});
// or
window._paq.push
// or through
window.Piwik.getTracker
打开 http://localhost:8080,随便访问几个菜单,然后打开 matomo
此时,路由已经有数据了
并且将用户的常规数据聚合起来。
更多
本文只对 sentry 和 matomo 进行了简单介绍。而这两者还有更深入的使用,比如 sentry 可用于推送邮件、文中一带而过的 sourcemap、单点登录(集成内部的权限认证)、自定义上报内容(将错误与用户 id 关联起来)以及敏感数据脱敏等;matomo 可用于每日发送分析报表、增加 kafka 插件、进行更深层次的挖掘、自定义上报内容(购物车等)、大数据量情况下的优化、优化用户设备指纹以及使用了 nginx 等反代软件后如何正确识别真实 ip、热力图、A/B test 以及漏斗图等。
作者介绍
赵安家,山东顺能网络全栈研发工程师。前端后端通吃,DevOps、安全、培训都有涉猎,负责了公司从单体服务迁移至微服务的项目。
更多内容推荐
实战 1:从 0 到 1 建立系统应用的可观测性
这节课,我会基于一个典型的Spring Cloud的应用,给你讲解如何从 0 到 1 来构建端到端的全链路可观测性,如何打通可观测性数据的联合。
2022-10-05
常见的主要监控数据获取方式
监控系统从实施的角度来看主要可以分为三类:主动上报、被动抓取、旁路捕获。
2022-09-12
基金这么赚钱!!编程实现基金从采集到分析通用模板!(白酒为例)
玩过几个月的基金,所以今天闲着没事看能不能编程实现-从采集基金数据然后进行分析
2021-08-19
到底什么是 RUM?生产环境如何选择靠谱的前端 RUM 监控系统
RUM 英文全称是 Real User Monitoring,它作用是捕获和分析用户与网站的所有交互细节,旨在提高网站的可用性、提升用户体验。提升网站体验的方式非常多,可以优化数据库、优化接口调用,那为什么要 RUM 呢?
爱奇艺智能前端异常监控平台的设计与实践
前端监控一般包括三方面:异常监控、性能监控(First Meaningful Paint、First Contentful Paint等性能指标监控)及行为数据监控(PV、UV、页面停留时长等监控)。
7. JMeter 压测插件
2023-09-25
如何实现用户行为的动态采集与分析
在我们的实际业务中是否经常会有这样的思考:哪个广告位、资源位更有价值?哪些人是自己的目标客户?那些提升用户体验的优化,效果究竟如何?怎么去衡量?这些问题都需要数据指标的支撑。那么本文将为大家分享如何从 0-1 建设用户采集与分析系统的经验。
鹅厂分布式大气监测系统:以 Serverless 为核心的云端能力如何打造?
以 Serverless 为核心的云架构大气监测项目,放出源码啦!
作业帮 GO 应用框架实践
作业帮初期因业务快速发展,服务端采用PHP语言作为主要开发语言,很好支撑了业务快速的迭代发展。微服务架构支持欠缺:ODP通过PHPLIB耦合服务,类单体架构,服务间边界模糊,框架全局部署且缺乏现代包管理工具。
极客时间运维进阶训练营第六周作业
logstash收集日志的常用插件使用
2022-12-07
windows7 本地搭建 ELK 收集项目运行日志
=====
2021-11-11
实战 3:构建基于 Kubernetes 的系统可观测性
这节课,我们来看看如何构建基于 Kubernetes 的系统和应用的可观测性。
2022-10-10
一文搞定前端代理骚操作!再也不怕线上 bug 啦!
一文搞定前端代理骚操作!再也不怕线上bug啦!
17. Prometheus 详解
2023-09-26
分析 nginx 访问日志,统计前 10 的 ip
按以下步骤分析nginx访问日志并统计前10的ip:
2023-04-20
Vue 进阶(一):Vue 学习资料汇总
nodejs官网下载安装包;
2021-08-03
07|数据获取:什么是 Scrapy 框架?
这节课我们来深入了解一下Python中的常见爬虫框架:Scrapy框架。我们将学习什么是Scrapy框架、它的特点是什么以及如何安装和使用它。
2023-04-24
软件测试 | 普罗米修斯 - 自定义 exporter
普罗米修斯提供了多种语言的 client, 用户可以使用 client 很方便的构建自己的 exporter 服务, 后续只需要修改普罗米修斯的配置文件, 就可以把 exporter 加入到普罗米修斯中来。
2023-03-01
04|如何快速搭建 Prometheus 系统?
这一讲我们来自己动手搭建Prometheus
2023-01-16
如何从 0 到 1 搭建性能检测系统
不同的团队有着各自不同的业务,业务之间千差万别,性能指标也不能一概而论,所以用一套统一的检测模型覆盖所有场景是不现实的。本文将介绍如何定制一个属于自己团队的性能检测平台。
推荐阅读
用 Tensorflow.js 做了一个动漫分类的功能(二)
2023-05-15
10、Nginx 应用实战之虚拟主机应用
2023-09-28
8.Jenkins 实战 1- 集成 Ansible(上)
2023-09-30
红队攻防之快速打点
2023-07-03
21|部署一个鲜花网络电商的人脉工具(下)
2023-10-25
达达埋点迁移京东子午线实践 | 京东云技术团队
2023-11-20
使用基于 tideways 的 php-monitor 搭建 PHP 性能监控平台
2023-09-09
电子书
大厂实战PPT下载
换一换 杨攀 | 极客邦科技 副总裁、TGO 鲲鹏会总经理
马阳阳 | 去哪儿旅行 基础架构部/资深研发工程师
谭坦 | 施耐德电气 数字化服务/首席架构师
评论