我有 Logstash 1.4.2 版本使用该HAPROXYHTTP
模式分析 haproxy 日志,并且它已经将计数器和时间信息发送到 statsd 以便在 Graphite/Whisper 中进行聚合和后续存储。
现在,我想计算特定路径元素包含在 URI 组件中的具体次数,然后将该值也发送到 statsd。
我感兴趣的路径是:/important/new
我尝试使用mutate
和条件正则表达式添加标签,但到目前为止,结果显示匹配的日志比我预期的要多。我想我没有理解过滤器部分应该如何工作。
我的 logstash 配置尝试目前看起来像这样,尽管为了简洁起见我删除了一些工作指标。
input {
file {
type => "haproxy"
path => "/var/log/haproxy/haproxy.log"
}
}
filter {
if [type] == "haproxy" {
grok {
match => { "message" => "%{HAPROXYHTTP}" }
}
if [http_request] =~ /^\/important\/new$/ {
mutate { add_tag => "important" }
}
}
}
output {
if [type] == "haproxy" {
statsd {
host => "statsd-host"
count => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.response_size", "%{bytes_read}"
]
increment => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.hits",
"haproxy.%{important}"
]
timing => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.response_time", "%{time_duration}",
]
}
}
}
非常感谢。
答案1
我相信我已经找到了如何做到这一点,所以我想发布我自己的答案。
关键部分是让输出部分也以标签为条件。例如:
output {
if [type] == "haproxy" {
statsd {
host => "statsd-host"
count => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.response_size", "%{bytes_read}"
]
increment => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.hits",
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.responses.%{http_status_code}"
]
timing => [
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.response_time", "%{time_duration}",
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.queue_time", "%{time_queue}",
<snip snip more of these>
"haproxy.%{frontend_name}.%{backend_name}.%{server_name}.response_size", "%{bytes_read}"
]
}
if "important" in [tags] {
statsd {
host => "statsd-host"
increment => [
"haproxy.important"
]
}
}
}
}