Vector의 소개(그리고 inflexdb2.0과의 합작)

13266 단어 influxdb2vector
이번에는 Vector라는 piperline 도구를 본사의 사례(조금)와 결합하여 소개합니다.
Vector 소개
https://vector.dev/
한마디로 Rust제의 초속도 경량의 파이프 공구다.
유사한 도구로 말하자면, flund와logstash가 바로 이것이다.
나는 공식 사이트를 보는 것이 가장 이해하기 쉽다고 생각한다. 개요를 간단하게 설명하기 위해서다.
현재 단계에서 자체 제작 플러그인을 사용하는 것은 어려울 것 같아서 이런 상황에서flumentd를 선택하는 것이 좋습니다.
※ 아래 사진은 공식 홈페이지에서 참조.
개념도
  • Sources
  • Transforms
  • Sinks
  • 세 부분으로 나누다.
    Sources
    Sources 모니터링 파일, 표준 출력, HTTP, 외부 클라우드 서비스 등을 Vector의 데이터로 입력합니다.
    Transforms
    Transforms는 이름처럼 Sources를 통해 얻은 데이터를 가공합니다.
    로그를 필터링하거나 지우거나 JSON으로 변환하거나 태그를 추가하거나 제거할 수 있습니다.
    정규 표현식을 지원하기 때문에 프로그램에서 이루어진 원시 로그도 해석되고 개별 매개 변수로 처리될 수 있습니다.
    Sinks
    Sinks는 Transforms를 통해 가공된 데이터를 다양한 DB에 저장하거나 파일에 저장합니다.
    DB와 inflexdb2에 대응합니다.0과 클릭하우스에 대응하는 게 좋아요.
    다른 도구와 비교

    파일에 대한 감시에는 일련의 기능이 있다.
    공연에 관하여
    https://vector.dev/#performance
    CPU

    Memory

    I/O

    File To TCP, TCP To Backhole, TCP To HTTP에서 입출력 1위에 올랐다.
    CPU는 그나마 괜찮았고 메모리도 앞섰다.
    전체적으로 보면 도내 메모리의 I/O 성능이 매우 높은 것 같습니다.
    설치 방법
    OS 패키지는 간단히 설치할 수 있습니다.(다음은 Ubuntu의 예)
    Ubuntu의 경우 deb 패키지가 있으므로 등록하고 설치하기만 하면 됩니다.
    샘플로 ansible의task를 미리 싣습니다.
    - name: Download .deb package
      get_url:
        url: https://packages.timber.io/vector/0.10.X/vector-amd64.deb
        dest: /tmp/vector-amd64.deb
      tags:
        - install
    
    - name: Install package
      apt:
        deb: /tmp/vector-amd64.deb
      tags:
        - install
    
    - name: put config template
      template:
        src: vector.toml.j2  # 後述します
        dest: /etc/vector/vector.toml
      notify:
        - Reload vector  # handlersに設定する必要あり
    
    - name: add adm group to vector user
      user:
        name: vector
        groups: adm
        append: yes  # nginxのログを監視するため
    
    - name: Start Vector
      systemd:
        name: vector
        state: started
        enabled: yes
    
    프로파일 정보
    toml 형식으로 설정합니다.
    최초 설명된 Sources, Transforms, Sinks 부분으로 나뉘어 간단하게 설정할 수 있다.

    Link-U의 사례
    nginx의 접근 로그 (ltv 형식) 를 inflexdb2에 입력하십시오.0으로 저장합니다.
    nginx
    ltv의 설정은 다음과 같다.
    log_format ltsv 'time:$time_iso8601\t'
                    'status:$status\t'
                    'remote_addr:$remote_addr\t'
                    'request_method:$request_method\t'
                    'request_uri:$request_uri\t'
                    'host:$host\t'
                    'request_time:$request_time\t'
                    'bytes_sent:$bytes_sent\t'
                    'referer:$http_referer\t'
                    'useragent:$http_user_agent\t'
                    'app_info:$upstream_http_x_app_info';
    
    app_info는 출력 프로그램이 되돌아오는 매개 변수로 설정됩니다.
    Sources
    [sources.nginx_log_api]
      # General
      type = "file" # required
      ignore_older = 86400 # optional, no default, seconds
      include = ["/var/log/nginx/api.log"] # required
      exclude = ["/var/log/nginx/error.log", "/var/log/nginx/*.log-*"] # required
      start_at_beginning = false # optional, default
    
    include로 특정한 파일을 지정했기 때문에 exclude의 내용은 필요하지 않지만 설명을 위해 넣습니다.
    Transforms
    ltsv 형식을 해석하기 위해 정규 표현식을 열심히 쓰겠습니다.
    Types에서 구상의 유형을 지정합니다.
    (metric로 전환된 것은 당시 influmxdb의 경우 그것이 필요했기 때문이다.)
    [transforms.nginx_parser_api]
      type = "regex_parser"
      inputs = ["nginx_log_api"]
      regex = "^time:(?P<timestamp>[^\\t]+)\\tstatus:(?P<status>\\d+)\\tremote_addr:(?P<remote_addr>[^\\t]+)\\trequest_method:(?P<request_method>\\w+)\\trequest_uri:(?P<request_uri>[^\\t]+)\\thost:(?P<host>[^\\t]+)\\trequest_time:(?P<request_time>[^\\t]+)\\tbytes_sent:(?P<bytes_sent>[^\\t]+)\\treferer:(?P<referer>[^\\t]+)\\tuseragent(?P<useragent>[^\\t]+)\\tapp_info:(?P<app_info>[^\\t]+)$"
      drop_field = true
      field = "message"
    
      # Types
      types.timestamp = "timestamp|%Y-%m-%dT%H:%M:%S%z"
      types.status = "int"
      types.remote_addr = "string"
      types.request_method = "string"
      types.request_uri = "string"
      types.host = "string"
      types.request_time = "float"
      types.bytes_sent = "int"
      types.referer = "string"
      types.useragent = "string"
    
    [transforms.nginx_parser_to_metric]
      type = "log_to_metric"
      inputs = ["nginx_parser_api"]
    
      [[transforms.nginx_parser_to_metric.metrics]]
        type = "gauge"
        field = "request_time"
        tags.status = "{% raw %}{{status}}{% endraw %}"
        tags.host = "{% raw %}{{remote_addr}}{% endraw %}"
        tags.request_method = "{% raw %}{{request_method}}{% endraw %}"
        tags.request_uri = "{% raw %}{{request_uri}}{% endraw %}"
        tags.host = "{% raw %}{{host}}{% endraw %}"
        tags.referer = "{% raw %}{{referer}}{% endraw %}"
        tags.useragent = "{% raw %}{{useragent}}{% endraw %}"
    
    
    Sinks
    ansible 템플릿 관리 설정 파일을 사용하기 때문에 일부 변수화됩니다.
    [sinks.influxdb]
      # General
      type = "influxdb_metrics"
      inputs = ["nginx_parser_to_metric"]
      endpoint = "http://{{ influxdb_endpoint }}:8086"
      namespace = "nginx"
      bucket = "{{ influxdb_bucket_name }}"
      healthcheck = true
    
      # Auth
      org = "Link-U"
      token = "{{ influxdb_auth_token }}"
    
    총결산
    다음 그림은 시간당 두드리는 API의 수입니다.
    샘플 데이터이기 때문에 도표의 변화가 매우 적다.0으로 표시되면 API 단위로 숫자를 계산할 수 있습니다.
    또한 API별 평균 응답 속도, 가장 빠른 속도, 가장 느린 시간 등 액세스 로그에 있는 매개변수에서 숫자를 확인할 수 있습니다.

    Vector를 사용하면 데이터를 어렵지 않게 간단하게 시각화할 수 있습니다.
    flumentd를 사용하는 곳이 많지만 메모리를 절약한다는 점에서 앞으로 Vector도 선택항이 될 수 있다.

    좋은 웹페이지 즐겨찾기