通过ELK快速分析PHP slow_log栈

分析PHP慢的原因有很多种:

比如通过xhprof.

有些通过sort/uniq的组合操作分析.

其实如果已经有了ELK(现在叫elastic stack)的话, 甚至可以更直观, 更方便前后对比.

今天来说一说如何通过分析php_slow_log快速”定位(估计)”慢的环节.

思路来源自这篇文章: http://chenlinux.com/2015/03/06/kibana4-for-slowlog/

效果图:

 

最外圈是调用栈最一层的比例, 第二层是调用栈第二层.

这种图可以在PHP变慢的时候可以快速查看是哪个调用栈的问题. 比如数据库调用变慢, 还是内部逻辑问题.

 

可惜参考文章不是通过logstash实现, 看了一下logstash, 没有比较简单的原生实现. 这又何妨, 世上无难事只怕有心人,  索性拆分方式直接改为写ruby代码:

配置文件如下: 有这样需求的同学, 拿走, 不谢.

filter {
  if [type] == "php_fpm_slow" {
    grok {
      match => {
        message => "(?m)\[(?<timestamp>\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2})\]\s+\[(?<pool_name>\w+\s\w+)\]\spid\s%{NUMBER:php_pid:int}\nscript_filename = %{UNIXPATH:slow_script}\n(?<php_slow_stack>\[\w{18}\] (?<slow_func>[^\[]*?:\d+).*\[\w{18}\](?<begin_func>[^\[]*?:\d+))$"
      }
    }
    mutate {
      gsub => ["php_slow_stack", "\[\w{18}\] ", ""]
    }
    ruby {
      code => "php_slow_stack_hash = Hash.new; if event.get('php_slow_stack'); event.get('php_slow_stack').split(/\r?\n/).each_with_index {|item, index| php_slow_stack_hash[index] = item }; end; event.set('php_slow_stack', php_slow_stack_hash)"
    }
    mutate {
        merge => ["php_slow_stack", "php_slow_stack"]
    }

  }
}

output {
  if [type] == "php_fpm_slow" {
    elasticsearch {
      hosts => ["10.24.252.67:9200"]
      index => "php-fpm-slow-log-%{+YYYY.MM.dd}"
      document_type => "%{type}"
      flush_size => 2000
      idle_flush_time => 5
    }
  }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注