学习 Dancer::Plugin::Auth::Extensible 模块

21 Dec 2012 Posted in  dancer

首先介绍一下 Dancer::Plugin::Auth::Extensible 模块。这是一个认证验证的框架,之前 Dancer 里这方面的框架是 RBAC ,不过 RBAC 是实现的 auth 对象,然后提供 ->asa->can->roles 等方法。在使用的时候,需要自己在每个 route 里写 if 或者 switch 代码,显得比较繁琐。而 Extensible 模块提供了另一个(或者说是两个)思路。同时借此深入了解 Dancer::PluginDancer::Hook 的用法,外加熟悉 perl 的一些不常见的对象使用。收获良多,不可不记。 继续阅读……


Dancer 框架使用 Text::XSlate 模版的注意事项

19 Dec 2012 Posted in  dancer

Dancer 框架自带有一个 Simple 模版,不过推荐使用 Template 模块作为替代品。不过从性能上来说,TT2 比之前博客里陆续介绍过的 HTML::TemplateText::MicroTemplate 都要差。而这方面最好的,就是 Text::XSlate 模块了。今天尝试将一个 Dancer 应用迁移到 Text::XSlate 上。踩进两个坑,特此记录。 继续阅读……


perl发起HTTP请求时如何设置Host头

16 Dec 2012 Posted in  perl

之所以写这么个内容,是今天突然发现之前有个脚本的效果完全不对。这个脚本是用 Furl 模块发 HTTP 请求。看 POD 的说明,以为这样写是生效的: 继续阅读……


不小心踩进ElasticSearch.pm模块的坑里了

11 Dec 2012 Posted in  logstash

在今天以前,我一直认为perl的ElasticSearch.pm是除了原生java库以外封装最好的。不过今天踩进一个硕大的坑里,多亏 dancer-user 邮件列表里外国友人的帮助,才算爬了出来…… 继续阅读……


用gnuplot绘制直方图

10 Dec 2012 Posted in  monitor

越来越喜欢用 gnuplot 画图了,因为有时候发现自己实在是不会用 Excel…… 继续阅读……


把docx文档转换成markdown格式发布

01 Dec 2012 Posted in 

有些Word文档想搬到博客上来,而博客用的是markdown的格式。最简单的办法是在Word里转成html格式另存为,因为markdown和html是兼容的。不过word直接另存为的html里面带有“海量”的无聊样式,实在不方便之后我们再用vim的工具编辑。所以还是想办法整整。 继续阅读……


用 Tatsumaki 框架写 elasticsearch 界面

22 Nov 2012 Posted in  logstash

Tatsumaki是Plack作者的一个小框架,亮点是很好的利用了psgi.streaming的接口可以async的完成响应。不过因为缺少周边支持,所以除了几个webchat的example,似乎没看到什么应用。笔者之前纯为练手,却用tatsumaki写了个sync响应的小demo,算是展示一下用tatsuamki做普通web应用的基础步骤吧: 继续阅读……


用gnuplot绘制多图

22 Nov 2012 Posted in  monitor

以前已经提过多次gnuplot的简便快捷了。不过大多是最基本的单图上画条线之类的。这次碰到需求,稍微help了一下在一个图上画多个区域。主要需要注意的就是set size的定位点到底从什么角度算,说实话蛮麻烦的。 继续阅读……


syslog实时报警"说出来"

19 Nov 2012 Posted in  monitor

syslog应该是大家最常用的,也基本可以说是最重要的服务器监控信息来源了。 继续阅读……


【翻译】用ElasticSearch和Protovis实现数据可视化

18 Nov 2012 Posted in  logstash

搜索引擎最重要的目的,嗯,不出意料就是搜索。你传给它一个请求,然后它依照相关性返回你一串匹配的结果。我们可以根据自己的内容创造各种请求结构,试验各种不同的分析器,搜索引擎都会努力尝试提供最好的结果。 继续阅读……


【翻译】Coro模块文档

18 Nov 2012 Posted in  perl

名称

Coro —— perl唯一真正的线程 继续阅读……


Chrome的APP简单用法

09 Nov 2012 Posted in  web

学习一下简单的chrome app写法。首先,chrome的ext和web app和packaged app就要分清楚。简单说,ext就是可以出现在地址栏右侧的,app是可以出现在任务栏右侧的。而web app其实就是用json描述了一个url地址,packaged app则是最接近普通桌面程序的,需要完整的带有html/css/js等内容。但同时,因为packaged app可以在关闭chrome浏览器后运行,所以有些浏览器上的API它也用不了。 继续阅读……


【Logstash系列】Outputs::ElasticsearchHTTP自动获取随机node

30 Oct 2012 Posted in  logstash

今天在ES群中和medcl请教了一下index的性能问题。基本上在bulk的基础上,还有几点是可以做的。当然medcl说的是正常的全文索引的场景: 继续阅读……


用systemtap调试文件描述符限制

26 Oct 2012 Posted in  linux

在运行一些非root用户进程的时候,我们都习惯要在前面加上一个ulimit -HSn 65535的命令。而且我们还知道关于文件描述符的限制,不止这一个地方,还有limits.conf,sysctl -w fs.file-max等等。但是到底这些是什么个关系呢?而且,如果是一个已经在运行的程序,有没有可能在更改他的文件描述符限制呢? 继续阅读……


【Logstash系列】ElasticSearch的几点使用事项

21 Oct 2012 Posted in  logstash

之前已经写过一些ES的使用,也翻译了一篇官网上关于ES存储日志的建议日志。今天稍微总结一下近期以来实践出来的方案。 继续阅读……


用Juggernaut实时推送syslog分析结果

17 Oct 2012 Posted in  web

大家一般都会用rsyslog或者syslog-ng之类的收集系统日志。不过收集之后的处理就各种各样了。这里提供一个简单的处理,按日期保存成文件,然后定时分析新增内容,通过websocket推送到页面报警。这对于像磁盘错误等信息比较有用。因为等nagios之类的监控反应出来,故障可能就已经到你措手不及的地步了。 继续阅读……


Perl5里的gather/take

02 Oct 2012 Posted in  perl

九月末的YAPC::Asia上,Larry Wall展示了一下怎么把一个perl5上很标准的排序脚本改造成perl6脚本。主要是条件语句不再用()了,子函数传参方式,对象化操作等等。唯独有个命令是之前未见过的:gather/take。用这个可以减少临时变量的使用。 继续阅读……


用javascript操作新版本amcharts

26 Sep 2012 Posted in  web

新版本的amcharts用js和html5改写。不再简单的用settings.xml而是写成js的object了。好在例子依然详细。下面贴一段从数据库里取值并绘制成多栏图式的代码:
```javascript 继续阅读……


【Logstash系列】数据格式之json-event

21 Sep 2012 Posted in  logstash

之前的各种示例中,都没有提到logstash的输入输出格式。看起来就好像logstash比Message::Passing少了decoder/encoder一样。其实logstash也有类似的设定的,这就是format。有三种选择:plain/json/json_event。默认情况下是plain。也就是我们之前的通用做法,传文本给logstash,由logstash转换成json。 继续阅读……


【Message::Passing系列】Regexp::Log模板匹配变量

16 Sep 2012 Posted in  logstash

上面调用的Regexp::Log::Nginx是base Regexp::Log的实例,CPAN上已经提供了好些server的log regex,见http://search.cpan.org/search?query=Regexp%3A%3Alog&mode=all
perl #!/usr/bin/perl package Regexp::Log::Nginx; use warnings; use strict; use base qw( Regexp::Log ); use vars qw( $VERSION %DEFAULT %FORMAT %REGEXP ); %DEFAULT = ( format => '%date %status %remotehost %domain %request %originhost %responsetime %upstreamtime %bytes %referer %useragent %xforwarderfor', capture => [ 'ts', 'status', 'remotehost', 'url', 'oh', 'responsetime', 'upstreamtime', 'bytes' ], ); %FORMAT = ( ':default' => '%date %status %remotehost %domain %request %originhost %responsetime %upstreamtime %bytes %referer %useragent %xforwarderfor', ); %REGEXP = ( '%date' => '(?#=date)\[(?#=ts)\d{2}\/\w{3}\/\d{4}(?::\d{2}){3}(?#!ts) [-+]\d{4}\](?#!date)', '%status' => '(?#=status)\d+(?#!status)', '%remotehost' => '(?#=remotehost)\S+(?#!remotehost)', '%domain' => '(?#=domain).*?(?#!domain)', '%request' => '(?#=request)-|(?#=method)\w+(?#!method) (?#=url).*?(?#!url) (?#=version)HTTP/\d\.\d(?#!version)(?#!request)', '%originhost' => '(?#=originhost)-|(?#=oh).*?(?#!oh):\d+(?#!originhost)', '%responsetime' => '(?#=responsetime)-|.*?(?#!responsetime)', '%upstreamtime' => '(?#=upstreamtime).*?(?#!upstreamtime)', '%bytes' => '(?#=bytes)\d+(?#!bytes)', '%referer' => '(?#=referer)\"(?#=ref).*?(?#!ref)\"(?#!referer)', '%useragent' => '(?#=useragent)\"(?#=ua).*?(?#!ua)\"(?#!useragent)', '%xforwarderfor' => '(?#=xforwarderfor)\"(?#=xff).*?(?#!xff)\"(?#!xforwarderfor)', ); 1; 继续阅读……


【Message::Passing系列】过滤器实例

16 Sep 2012 Posted in  logstash

Message::Passing是Suretec公司为自己的VoIP业务开发的logstash山寨版。这几个月更新还是比较快的。比之前我刚关注它时改变很大。比如Message::Passing::Output::ElasticSearch已经出来了,还有专门的Message::Passing::Filter::ToLogstash,连命令行方式Message::Passing::Role::Script都采用了MooX::Options构建,相当的OO了。 继续阅读……


【Message::Passing系列】客户端收集脚本

16 Sep 2012 Posted in  logstash

最后编写一段日志收集的agent:
perl #!/usr/bin/perl package NginxLogCollector; use Moo; use MooX::Options; use Message::Passing::DSL; use MooX::Types::MooseLike::Base qw/ Str /; use namespace::clean -except => [qw( meta _options_data _options_config )]; with 'Message::Passing::Role::Script'; option filename => ( is => 'ro', isa => Str, default => sub { '/data/nginx/logs/access.log' }, ); option rabbitmq => ( is => 'ro', isa => Str, default => sub { '10.3.18.199' }, ); sub build_chain { my $self = shift; message_chain { output rabbitmq => ( class => 'AMQP', exchange_name => 'logcollect', # 目前测试结果,发现Input::AMQP无法接收到非topic的exchange # CPAN上有关RabbitMQ的模块都是这个哥们写的,POD简略到没有一样,表示无语下 # exchange_type => 'direct', hostname => $self->rabbitmq, username => 'guest', password => 'guest', ); output debug => ( class => 'STDOUT', ); encoder("encoder", class => 'JSON', output_to => 'rabbitmq', output_to => 'debug', ); filter grok => ( class => 'GrokLike', output_to => 'encoder', ); filter logstash => ( class => 'ToLogstash', output_to => 'grok', ); decoder("decoder", class => 'JSON', output_to => 'logstash', ); input nginxlog => ( class => 'FileTail', output_to => 'decoder', filename => $self->filename, ); }; } __PACKAGE__->start unless caller; 1;
目前就做到这步,之后从rabbitmq里往elasticsearch写的还没搞。从上面的chain可以很清除的看到和logstash一样的管道思想,input->decoder->filter->encoder->output。巧的是两种写法中,decode/encode那个写法跟puppet的DSL定义特别的像。哈哈~ 继续阅读……


【Message::Passing系列】ElasticSearch的bulk_index速度测试

16 Sep 2012 Posted in  logstash

连续尝试了logstash的elasticsearch/elasticsearch_http/elasticsearch_river三个putput模块,发现其index/bulk/river三种插入方式的实际运行效果速度居然没有差异。而使用perl脚本测试,单例下index不到300msg/sec,bulk接近2500msg/sec,几乎翻了10倍。 继续阅读……


(R)?ex介绍

06 Sep 2012 Posted in  devops

按说这文章好像轮不到我写。几个线上运用着的哥们都不出手,我勉强记录一些官网上没写example但实际应该蛮常用的功能吧: 继续阅读……


【翻译】用ElasticSearch存储日志

26 Aug 2012 Posted in  logstash

介绍

如果你使用elasticsearch来存储你的日志,本文给你提供一些做法和建议。 继续阅读……