Назад | Перейти на главную страницу

Условный вывод 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}",
        ]
     }
  }
}

Большое спасибо.

Я считаю, что узнал, как это сделать, поэтому решил опубликовать свой собственный ответ.

Ключевой частью было сделать раздел вывода также условным для тега. Например:

  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"
          ]
        }
      }
    }
  }