Условный вывод logstash в statsd - на основе URI запроса haproxy

У меня Logstash версии 1.4.2, анализирующий журналы haproxy с помощью HAPROXYHTTP шаблон, и он уже отправляет счетчики и информацию о синхронизации в 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"
          ]
        }
      }
    }
  }
Другие вопросы по тегам