Articles of 分析

用户分段引擎使用MongoDB

我有一个分析系统,以事件的forms跟踪客户及其属性以及他们的行为。 它使用Node.js和MongoDB(使用Mongoose)来实现。 现在我需要实现一个分段function,允许根据特定的条件将存储的用户分组。 例如, purchases > 3 AND country = 'Netherlands' 在前端,这看起来像这样: 这里一个重要的要求是细分市场实时更新,而不是定期更新。 这基本上意味着,每当用户的属性改变或触发新的事件时,我必须再次检查他属于哪个段。 我目前的做法是将这些段的条件存储为MongoDB查询,然后我可以在用户集合上执行,以确定哪些用户属于某个段。 例如,用于过滤所有使用Gmail的用户的细分将如下所示: { _id: '591638bf833f8c843e4fef24', name: 'Gmail Users', condition: {'email': { $regex : '.*gmail.*'}} } 当用户匹配条件时,我会直接在用户的文档中存储他属于“Gmail用户”细分: { username: 'john.doe', email: 'john.doe@gmail.com', segments: ['591638bf833f8c843e4fef24'] } 但是通过这样做,每次用户数据发生变化时,我都必须执行所有段的查询,以便我可以检查他是否是段的一部分。 从性能的angular度来看,这感觉有些复杂和繁琐。 你可以想办法解决这个问题吗? 也许使用规则引擎,并在应用程序中而不是在数据库中进行处理?

Dtrace的Node.js分析不会显示函数名称

我正在尝试使用DTrace为我的项目分析CPU利用率。 我只是跟着脚本 问题是它不显示函数名称。 stacks.out文件如下所示: CPU ID FUNCTION:NAME 0 73700 :tick-60s node`_ZN2v86Object3GetENS_6HandleINS_5ValueEEE+0x1 node`_ZN4node7TCPWrap12OnConnectionEP11uv_stream_si+0x14b node`uv__server_io+0xbf node`uv__io_poll+0x259 node`uv_run+0xda node`_ZN4node5StartEiPPc+0x16d node`main+0x1b node`_start+0x83 1 node`_ZN4node6Buffer4FillERKN2v89ArgumentsE+0x22b 0x82474d1b 0x8241ee9c 0x8241e624 0x8241e30f 0x82426abd 0x82419e4e 0x82419948 0x82413fc3 0x8d20e501 0x82416f65 0x82413f98 0x8243e7d3 0x824186c0 0x8246e8cf 0x8d221899 0x8d21308a node`_ZN2v88internalL6InvokeEbNS0_6HandleINS0_10JSFunctionEEENS1_INS0_6ObjectEEEiPS5_Pb+0x101 node`_ZN2v88internal9Execution4CallENS0_6HandleINS0_6ObjectEEES4_iPS4_Pbb+0xc9 node`_ZN2v88Function4CallENS_6HandleINS_6ObjectEEEiPNS1_INS_5ValueEEE+0x10b node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_8FunctionEEEiPNS1_INS0_5ValueEEE+0x4c node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_6StringEEEiPNS1_INS0_5ValueEEE+0x66 node`_ZN4node10StreamWrap12OnReadCommonEP11uv_stream_si8uv_buf_t14uv_handle_type+0x14f node`_ZN4node10StreamWrap6OnReadEP11uv_stream_si8uv_buf_t+0x2e node`uv__read+0x281 node`uv__stream_io+0x131 node`uv__io_poll+0x259 node`uv_run+0xda node`_ZN4node5StartEiPPc+0x16d node`main+0x1b node`_start+0x83 1 火焰图显示hex(即“0x82474d1b”)作为函数调用,而不是实际的函数名称。 我使用OmniOS(基于Illumos的操作系统)vagrant box r151002 […]

表示进行asynchronous调用的中间件

我们有一个NodeJS Express应用程序,我们已经实现了一个自定义分析后端。 现在,我们正在决定如何实现跟踪机制,针对function手机等JS禁用的浏览器。 我们正在考虑的一种devise方法是创build一个中间件,拦截每个请求,从请求/上下文中提取参数并将它们发送到后端。 这是非常可扩展的,对于像我们这样的定制分析解决scheme来说非常合理。 另一种方法是创build一个像谷歌分析那样的跟踪像素,然后从中提取数据。 但是,这似乎是一个定制跟踪解决scheme的可扩展性更小的解决scheme,因为参数和数据结构可以随时改变或放大,不像GA。 我的问题是这样的 – 是否有任何其他的方面,使中间件,使asynchronous请求? 在创build服务器时,我们需要了解什么,因为对服务器的每个请求都要通过这个中间件? 我们是一个相当大的应用程序,每分钟几十万的stream量。

实时网站访客跟踪系统

我想开发一个允许我跟踪网站访问者的应用程序。 现在我正在探索node.js作为替代scheme。 这个系统将有3个部分: 服务器端脚本,可能是一个node.js服务器。 空气应用将是客户。 它将连接到node.js服务器并在线显示用户。 Javascript代码,将在网站的每个页面上的跟踪代码。 有人尝试过这样的事情吗? 任何想法,意见,build议将不胜感激。

MongoDB查询在mongo-shell上执行的时间为1ms,但在NodeJS上的执行时间为400ms以上

我有一个大的MongoDB集合,包含超过2GB的原始数据,我使用一个非常简单的查询来从集合中获取特定的文档。 文档大小的范围从10KB到4MB,Id字段被定义为索引。 这是我正在使用的查询(与mongojs模块): db.collection('categories').find({ id: category_id }, function(err, docs) { callback(err, docs.length ? docs[0] : false); }).limit(1); 当我使用MongoDB shell或Robomongo等GUI来执行这个查询时,无论物理大小如何,大约需要1ms的时间,但是当我在NodeJS上执行完全相同的查询时,响应时间从2ms到2s以上取决于数据量。 我只测量接收响应所需的时间,即使在.explain()等待超过500毫秒的情况下,MongoDB分析器( .explain() )显示仅执行一个毫秒即可执行查询。 现在,我可能做错了什么,但我不知道它是什么。 我对NodeJS比较陌生,但过去我曾经使用过MongoDB和PHP,而且从来没有遇到这样的性能问题,所以我倾向于认为我可能以某种方式滥用NodeJS。 我也试过在WebStorm上使用SpyJS进行分析,我看到有很多bson.deserialize调用快速地汇总成一个大堆栈,但是我无法进一步调查,因为SpyJS总是在这个时候崩溃。 可能有关,但我仍然不知道如何处理它。 请指教,任何线索将不胜感激。 编辑:这是db.categories.getIndexes()的结果: [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "my_db.categories" }, { "v" : 1, "key" : { "id" […]

在Linux上分析Node.js Web应用程序

哪个将是在Linux上configurationNode.js应用程序的最佳select? 我试过https://github.com/c4milo/node-webkit-agent和https://github.com/baryshev/look (这是基于节点时间),但他们都似乎相当实验。 最令我惊讶的是,这些工具报告的结果是不同的。 外观的主要缺点是堆快照不是很相关,你不能超过1分钟的CPUconfiguration文件。 使用node-webkit-agent,Chrome浏览器的内存不足。 我在使用JMeter向我的Web应用程序发送请求时正在执行分析。

在Node.js程序上使用DTrace时没有函数名称

我试图根据本指南在VirtualBox中的OmniOS虚拟机上使用DTrace进行Node.js程序的CPU分析,我完全按照以下步骤设置(除了使用节点0.10.26)。 不幸的是,DTrace不给我人类可读的JS函数名称,但只是原始函数地址(据我所知),看起来像这样,并不是很有帮助: CPU ID FUNCTION:NAME 0 66407 :tick-30s node`v8::internal::String::ComputeHashField(unibrow::CharacterStream*, int, unsigned int)+0x162 node`v8::internal::Utf8SymbolKey::Hash() [clone .part.342]+0xb9 node`v8::internal::HashTable<v8::internal::SymbolTableShape, v8::internal::HashTableKey*>::FindEntry(v8::internal::Isolate*, v8::internal::HashTableKey*)+0x20 node`v8::internal::SymbolTable::LookupKey(v8::internal::HashTableKey*, v8::internal::Object**)+0x38 node`v8::internal::SymbolTable::LookupSymbol(v8::internal::Vector<char const>, v8::internal::Object**)+0x4e node`v8::internal::Heap::LookupSymbol(v8::internal::Vector<char const>)+0x34 node`v8::internal::Factory::LookupSymbol(v8::internal::Vector<char const>)+0x34 node`v8::internal::JSProxy::CallTrap(char const*, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*)+0x76 node`v8::internal::JSProxy::GetPropertyWithHandler(v8::internal::Object*, v8::internal::String*)+0x108 node`v8::internal::Object::GetProperty(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::LookupResult*, v8::internal::Handle<v8::internal::String>, PropertyAttributes*)+0x57 node`v8::internal::LoadIC::Load(v8::internal::InlineCacheState, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::String>)+0x49d node`v8::internal::LoadIC_Miss(v8::internal::Arguments, v8::internal::Isolate*)+0xbd 0xa730a376 0x8966eee0 0x8968bb7c 0xa7321899 0xa731308a 以上是运行这些命令的结果: dtrace -n 'profile-97/pid == 12345 […]

在本地服务器上复制heroku / node.js内存泄露以进行debugging

如何在本地复制Heroku的内存问题进行debugging? 或更好的configuration文件内存使用Heroku? 我在Heroku上有一个Node.js应用程序。 一个服务器端实用程序做了一堆工作来生成用于用户项目的下载文件。 对于一个特别大的情况,Heroku经过一些练习后会产生以下警告: Process running mem=529M(103.4%) 2015-01-24T02:23:18.240108+00:00 heroku[web.1]: Error R14 (Memory quota exceeded) 2015-01-24T02:23:18.240108+00:00 heroku[web.1]: Process running mem=529M(103.4%) … 在每次额外的锻炼之后,记忆的使用会增加,所以在我看来就像一个确定的泄漏: 2015-01-24T02:31:22.321689+00:00 heroku[web.1]: Process running mem=747M(145.9%) 2015-01-24T02:31:22.321689+00:00 heroku[web.1]: Error R14 (Memory quota exceeded) 2015-01-24T02:31:44.523511+00:00 heroku[web.1]: Process running mem=747M(145.9%) 2015-01-24T02:31:44.523800+00:00 heroku[web.1]: Error R14 (Memory quota exceeded) 2015-01-24T02:32:06.296071+00:00 heroku[web.1]: Process running mem=747M(145.9%) 2015-01-24T02:32:06.296314+00:00 heroku[web.1]: Error R14 […]

有没有办法监视Node.JS应用程序的性能?

我对Node.JS很陌生,想知道有没有一种方法来监视性能,看看我的应用程序和哪个数据库事务大部分时间都是瓶颈,…

使用Segment发送Mixpanel收入服务器端

我正在尝试将服务器端的收入调用发送到细分受众群,以便将其显示为收入。 我知道,Mixpanel有一个track_charge调用,Segmentbuild议使用revenue事件。 有没有人在服务器端(特别是与Node.js)做到这一点? 这是我目前的电话 analytics.track({ userId: transaction.user.username, event: 'revenue', properties: { price: 1.00 } });