2021년 10월 17일 일요일

엘라스틱의 key-value 처리

스플렁크는 key-value 구조를 갖는 데이터에 대한 동적 필드 생성을 자동으로 처리해준다. 이게 싫으면 props.conf의 KV_MODE 설정을 바꾸면 됨.


엘라스틱은 자동 처리를 지원하지는 않지만 기능은 제공한다. 다음은 인제스트 노드의 kv 프로세서를 이용한 key-value 처리.
POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "dissect": {
          "field": "message",
          "pattern": "%{url}?%{param}"
        }
      },
      {
        "kv": {
          "field": "param",
          "field_split": " ",
          "value_split": "="
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "/path/a.php?a=1"
      }
    }  
  ]
}
{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "a" : "1",
          "param" : "a=1",
          "message" : "/path/a.php?a=1",
          "url" : "/path/a.php"
        },
        "_ingest" : {
          "timestamp" : "2021-10-17T09:12:59.8240992Z"
        }
      }
    }
  ]
}

로그스태시 역시 같은 기능의 kv 필터를 사용하면 된다. 그런데 beat는 해당 기능을 제공하지 않음. 물론 이 없으면 잇몸이라고 script 프로세서를 이용하면 같은 기능을 만들 수 있다.
processors:
  - dissect:
      tokenizer: "%{url}?%{param}"
      field: "message"
      target_prefix: ""
  - script:
      lang: javascript
      source: >
        function process(evt) {
          var key = evt.Get("param").split("=")[0];
          var val = evt.Get("param").split("=")[1];
          evt.Put(key, val);
        }
{
  "@timestamp": "2021-10-17T09:13:36.296Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "7.15.0"
  },
  "param": "a=1",
  "a": "1",
  "message": "/path/a.php?a=1",
  "url": "/path/a.php"
}

잠깐 살펴봤지만 인제스트 노드, 로그스태시, beat별로 데이터 수집 처리 체계가 조금씩 달라진다. 엘라스틱의 가장 큰 진입장벽이 아닐까 싶은데 오픈소스 연합(?) 성격 때문에 개선은 힘들 듯.

하지만 가장 먼저 제공된 로그스태시 기준의 기능 통일은 빨리 됐으면 좋겠다. 특히 beat 프로세서 중 dissect는 있는데 grok이 없는 건 이해가 가지 않는다. 일부러 안 만드나?

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스