durumis AI가 요약한 글
- Vector는 Datadog에서 나온 제품으로 로그 수집 및 집계, 변환을 지원하는 도구이다.
- Vector는 Rust로 작성되어 로그 변환 코드 작성이 편하고, 선언적으로 관리할 수 있으며 공식 문서가 잘 정리되어 있다.
- Vector 사용 시 최신화되지 못한 공식 문서와 관련 자료 부족이 아쉬웠지만, 큰 불편함은 없었다.
오늘은 Vector라는 툴을 소개해볼 예정입니다.
그 DataDog에서 나온 제품입니다.
여타 우리가 알고있는 promtail, otel 등이 하는 역할을 맡고있습니다.
로그 수집 및 집계, 변환을 지원하죠
특징은 아래와 같습니다
1. golang이 아닌 rust로 작성 됨
2. otel에 비해 로그 변환 코드를 작성하기 편함
3. 선언적으로 관리 가능
4. 잘 작성된 공식문서
뭐 공식 사이트 가면 아래와 같은 점들을 장점으로 내세우고 있지만
대부분의 장점들은 다른 툴들 또한 내세우고 있는점들이지않나 싶어 위에서는 제외했습니다.
그리고 사용해보면서 겪은 단점들을 얘기하자면
1. 최신화되지 못한 공식문서
2. 관련 자료 찾기가 힘듬
이정도가 될 것 같습니다.
사용하면서 크게 불편한 점은 못겪었지만, 관련 자료가 부재한다던지 최신화가 되지못한 것들이 많이 아쉬웠습니다.
저는 helm 만 사용하기에 helm 기준으로 작성하는 점 미리 사과드립니다 흑....
role: Agent data_dir: /var/lib/vector customConfig: data_dir: "/vector-data-dir" api: enabled: true address: 0.0.0.0:8686 sources: kubernetes_logs: type: kubernetes_logs exclude_paths_glob_patterns: - "**/*.gz" # default - "**/*.tmp" # default transforms: handle_multiline: type: reduce inputs: - kubernetes_logs expire_after_ms: 1000 group_by: - kubernetes_pod_name merge_strategies: message: concat_newline starts_when: match(string!(.message), r'^[((\d{4}-\d{2}-\d{2})|(\d{4}/\d{2}/\d{2})|GIN|(\d{2}:\d{2}:\d{2} ))') message_parsing: type: remap inputs: - handle_multiline source: |- .message = replace!(.message, r'\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]', "") structured, err1 = parse_grok(.message, "\\[%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME}\\] %{LOGLEVEL:level} (?<message>(.|\r|\n)*)") ?? parse_grok(.message, "\\[%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}\\] %{LOGLEVEL:level} (?<message>(.|\r|\n)*)") if err1 == null { . = merge(., structured) } .level = downcase(string(.level) ?? "info") ., err2 = merge(., .kubernetes) if err2 == null { del(.kubernetes) del(.namespace_labels.kubernetes_io_metadata_name) } sinks: loki: type: loki compression: snappy encoding: codec: json inputs: - message_parsing endpoint: http://loki-write.monitoring:3100 labels: forwarder: vector app: "{{{{container_name}}}}" namespace: "{{{{pod_namespace}}}}" level: "{{{{level}}}}"
다음과 같은 간단한 values.yaml을 작성하고
helm repo add vector https://helm.vector.dev helm upgrade --values values.yaml --install vector-agent vector/vector -n monitoring
위 커맨드를 통해 k8s에서 나오는 로그를 간단하게 loki와 통합 할 수 있었습니다.
다음을 작성하면서 겪었던 이슈가 몇개 있었습니다.
첫번째로 customConfig 작성 시, default로 적용되던 옵션들은 모두 비활성화 되기에 source, transform, sinks를 모두 직접 작성해주셔야합니다.
두번째, k8s log 특성 상 line을 기준으로 로그가 들어오기에, 에러트레이스 같은 멀티라인 로그들은 병합을 시켜주어야합니다.
이에 대해서 source.file에는 multiline 관련 옵션이 있지만, k8s는 전혀 없습니다.
그리고 벡터팀 내부 토론을 통해, transform.reduce를 지원하고, 그를 통해서 하라는 결과가 나왔습니다.
세번째, root.data_dir 뿐만 아니라 custom_config 내부의 data_dir도 설정해주어야 하더라고요..
내부에 저래 값이 박히는데, 설정이 안되어있을 경우 로그 관련하여 권한 부족 에러가 자주 발생하더라고요.. ㅎ
네번째, 전 helm을 이용해서 배포를 진행했는데, 그러다보니 문법이 겹치는게 있어서 이스케이프가 필요한 경우가 있더라고요.
그래서 그런지 문서에는 다음처럼 "{{ metadata }}" 되어 있어서 그대로 붙였다가 에러가 났습니다...
sinks: my_sink_id: type: loki inputs: - my-source-or-transform-id compression: snappy endpoint: http://localhost:3100 labels: '"*"': "{{ metadata }}"
그래서 꼭 helm에서는 "{{ {{ metadata }} }}" 처럼 이스케이프를 진행해주셔야합니다!
추가로 아키텍처 관련 고민이 있으시다면 아래 글을 참고해보시는 걸 추천드립니다.
https://vector.dev/docs/setup/deployment/topologies/