메트릭스 가공

주의사항

메트릭스 가공 단계는 조회된 데이터들이 각 단계를 순차적으로 수행하는 구조입니다. 따라서 이 단계에 포함되는 <명령어>들의 입력 순서가 중요합니다.

요약

명령어

기능

ROWNUM

줄번호 필드를 추가합니다.

SELECT

필드를 선택합니다. 선택되지 않은 필드은 조회되지 않습니다.

CREATE

필드를 추가합니다.

DELETE

필드를 삭제합니다.

RENAME

필드의 이름을 변경합니다.

GROUP

데이터를 그룹화합니다.

ORDER

데이터를 정렬합니다.

JOIN

다른 MQL에서 조회한 데이터를 본 데이터에 칼럼단위로 추가할때 사용합니다.

UPDATE

데이터를 가공, 정제합니다.

LIMIT

추출되는 데이터의 수를 제한합니다.

SKIP

해당 위치에서 조회되는 일부 데이터를 무시합니다.

FILTER-KEYS

특정 데이터를 가지고 있는 데이터만 추출합니다.

FIRST-ONLY

데이터 중에서 처음 데이터만을 통과 시키고 나머지는 버립니다.

TIME-FILTER

특정시간의 데이터를 SKIP할때 사용합니다.

INJECT

해당 위치에 MXQL 쿼리를 추가합니다.

ADJUST

숫자 필드의 값을 변경하기 위해 사용합니다.

FILTER

특정 조건을 가지고 있는 데이터만 다음 단계로 전달합니다.

ROWNUM

  • 기능 : 줄번호 필드를 추가합니다.

  • 예시 :

    CATEGORY agent_list
    FLEXLOAD
    ROWNUM

SELECT

  • 기능 : 필드를 선택합니다. 선택되지 않은 필드는 다음 단계로 전달되지 않습니다.

  • 옵션 :

옵션 이름

옵션 기능

default

like, notlike와 상관없이 조회하고 싶은 필드를 지정합니다.

like

지정한 값을 부분문자열로 가지는 필드만 조회합니다.

notlike

지정한 값을 부분문자열로 가지지 않는 필드만 조회합니다.

  • 예시 :

    -- 모든 필드를 선택하는 경우 1 (SELECT <명령어> <오퍼랜드>를 모두 입력하지 않은 경우)
    CATEGORY app_counter
    TAGLOAD
    -- 모든 필드를 선택하는 경우 2 (SELECT <명령어>의 <오퍼랜드>를 입력하지 않은 경우)
    CATEGORY app_counter
    TAGLOAD
    SELECT
    -- 조회하고 싶은 필드 이름을 직접 지정하는 경우, 문자열배열 <오퍼랜드>를 사용합니다.
    CATEGORY app_counter
    TAGLOAD
    SELECT [time, pcode]
    -- default로 설정할 필드의 값이 하나인 경우와 like 옵션을 사용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT {default:time, like:_m}
    -- default로 설정할 필드의 값이 여러개인 경우와 like 옵션을 사용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT {default:[time,name], like:_m}
    -- like와 notlike를 모두 사용하고 싶은 경우 SELECT <명령어>를 두 번에 나누어서 입력해야 합니다.
    CATEGORY app_counter
    TAGLOAD
    SELECT {default:[time,name], like:name}
    SELECT {notlike:pname}
  • 주의사항 :

    1. 만약 전체 필드를 선택할때는 <오퍼랜드>를 입력하지 않습니다.

    2. like와 notlike는 한 번에 지정할 수 없습니다. 여러 번의 SELECT에서 나누어서 지정해야 합니다.

NOTE : SELECT <명령어>는 출력되는 필드 순서를 변경할때도 사용합니다.

CREATE

  • 기능 : 필드를 추가합니다.

  • 옵션 :

옵션 이름

옵션 기능

value

특정 값을 가지는 필드를 생성합니다.

from

지정한 필드의 값을 가지는 필드를 생성합니다.

expr

입력한 수식의 결과를 값으로 가지는 필드를 생성합니다. 수식에는 필드의 이름이 사용될 수 있습니다.

oname

oid 컬럼의 이름을 지정하여, oid값에 대응되는 oname의 값을 가지는 컬럼을 생성합니다.

okind

okid 컬럼의 이름을 지정하여, okid값에 대응되는 okind name의 값을 가지는 컬럼을 생성합니다.

onode

onode 컬럼의 이름을 지정하여, onid값에 대응되는 onode name의 값을 가지는 컬럼을 생성합니다.

  • 예시 :

    -- value 속성을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    CREATE {key:active$, value:'#'}
    -- from 속성을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    CREATE {key:_id_, from:okind }
    -- expr 속성을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    CREATE { key:apdex, expr:" (apdex_satisfied+(apdex_tolerated*0.5))/apdex_total " }
    -- okind 속성을 지정하는 경우
    CATEGORY agent_list
    FLEXLOAD
    CREATE { key : my_okind_name, okind : okind}
    SELECT [ time, okind, okindName, my_okind_name]
  • 주의사항 :

DELETE

  • 기능 : 필드를 삭제합니다.

  • 예시 :

    CATEGORY app_counter
    TAGLOAD
    DELETE [pcode]
  • 주의사항 :

    1. 반드시 문자열 배열로 입력해야합니다. DELETE pcode는 동작하지 않습니다. (2021-06-23 기준)

RENAME

  • 기능 : 필드의 이름을 변경합니다.

  • 예시 :

    -- pcode 필드의 이름 my_pcode로 변경합니다.
    CATEGORY app_counter
    TAGLOAD
    RENAME { src : pcode, dst : my_pcode }
  • 주의사항 :

    1. time은 ORDER에서 최우선으로 사용되는 정렬 기준으로, time의 이름을 임의로 변경하면 ORDER가 동작하지 않을 수 있습니다.

GROUP

  • 기능 : 데이터를 그룹화합니다.

옵션 이름

옵션 기능

timeunit

그룹을 나눌 시간 기준을 설정합니다.

pk or primaryKey

그룹의 primaryKey를 지정합니다.

last

지정한 column의 데이터 중 마지막 값만 저장하고 싶을 때 설정합니다. oname과 같이 반복해서 같은 값이 사용될 때 사용합니다. 내부적으로 지정한 값을 key로 가지는 값에 계속 덮어써집니다.

listup

지정한 column의 데이터를 모두 메모리에 저장하고 싶을 때 설정합니다. 내부적으로는 지정한 값을 key로 가지는 List에 계속 값이 추가됩니다.

user

실시간 사용자를 계산하기 위한 옵션입니다. Blob 타입의 데이터를 저장한 column만 지정할 수 있습니다.(app_user 카테고리의 logbits 등)

merge

지정한 column의 데이터를 MetricValue(복합값)으로 저장하고 싶을 때 설정합니다. 내부적으로는 지정한 값을 key로 가지는 MetricValue값에 추가됩니다.

rows

하나의 그룹에 최대로 저장될 수 있는 데이터의 수를 지정합니다. 기본값은 10000입니다.

  • 예시 :

    -- 지정한 필드에 대해 merge로 설정하여 MetricValue로 설정한 뒤 sum 연산을 수행합니다.
    CATEGORY app_counter
    TAGLOAD
    SELECT [ time, okindName, okind, apdex_satisfied, apdex_tolerated, apdex_total]
    GROUP { timeunit:5000, pk:okind, last:okindName, merge:[apdex_satisfied, apdex_tolerated, apdex_total] }
    UPDATE { key:[apdex_satisfied, apdex_tolerated, apdex_total], value:sum }
원칙적으로 merge필드는 별도로 지정되어야 합니다. 하지만 last, merge, listup 세 가지 속성을 모두 명시하지 않은 경우에는 모든 number 필드는 merge필드로, number가 아닌 필드는 last 필드로 자동 선택 됩니다.
  • 주의사항 :

    1. 만약 레코드에 "time"필드가 없으면 전체를 그룹핑합니다.(GROUP <명령어>가 수행되기 전에 SELECT <명령어>로 time을 지정하지 않았거나, RENAME <명령어>로 time 필드의 이름을 변경했거나, DELETE <명령어>로 time 필드를 삭제한 경우)

UPDATE

  • 기능 : 필드의 데이터를 수정합니다. MetricValue 상태인 필드에 대해서 연산을 선택할 수 있습니다.

  • 옵션 :

옵션

기능

sum

MetricValue에 포함된 값을 더합니다.

min

MetricValue에 포함된 값 중 최소값을 구합니다.

max

MetricValue에 포함된 값 중 최대값을 구합니다.

last

MetricValue에 포함된 값 중 마지막에 추가된 값을 구합니다.

avg

MetricValue에 포함된 값의 평균을 구합니다.

cnt

MetricValue에 포함된 값의 갯수를 구합니다.

datetime

시간 데이터의 형식을 변경합니다.

timezone

시간 데이터의 기준을 설정합니다.

notnull

지정한 컬럼의 값이 null인 경우 적용할 default 값을 설정합니다. 필드값이 0인 컬럼은 본 <

pct

GROUP 명령 수행시 percentile을 위해 필드의 모든 값을 listup했을 경우 percentile 값을 필드값으로 변경할 수있습니다.

decimal

필드의 숫자 데이터를 포멧팅 할 수 있습니다.

  • 예시 : 옵션을 지정하여 데이터의 값을 수정합니다.

    -- value 옵션을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT [time, pcode,pname, tps]
    GROUP  {timeunit:5000, pk:pcode, last: pname, merge:tps}
    UPDATE {key:tps, value:sum}
    -- datetime, timezone 옵션을 지정하는 경우
    -- CREATE {key:localtime, from:time}의 경우 time 필드의 값 long 타입의 값으로 복사됩니다.
    CATEGORY app_user
    TAGLOAD
    SELECT [time, pcode, pname, logbits]
    CREATE {key:localtime, from:time}
    UPDATE {key:localtime, datetime:'yyyyMMdd HH:mm:ss', timezone: GMT+9}
    -- notnull 옵션을 지정하는 경우
    UPDATE {key:tps, notnull:0}
    -- pct을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT [ time, pcode, tx_count ]
    GROUP { key : pcode, listup : tx_count}
    UPDATE { key : tx_count, pct : 90}
    -- decimal 옵션을 지정하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT [ time, oname, apdex_satisfied, apdex_tolerated, apdex_total]
    GROUP  { timeunit:5m, pk:oname}
    UPDATE { key:[apdex_satisfied, apdex_tolerated, apdex_total], value:sum }
    CREATE { key:apdex, expr:" (apdex_satisfied+(apdex_tolerated/2.0))/apdex_total " }
    UPDATE { key:time, datetime:'yyyyMMdd HH:mm:ss', timezone:'GMT+9'}
    UPDATE { key:apdex, decimal:'0.000'}
    ROWNUM
  • 주의사항 :

    1. {datetime:'yyyyMMdd HH:mm:ss'}의 경우, 문자 ':'가 포함되어 있어, 반드시 '' 또는 ""로 감싸주어야 합니다.

    2. pct:90는 90%번째의 값을 선택한다는 의미입니다. 단 해당 필드는 GROUP명령이 수행될때 listup필드 지정되어있어야 합니다.

    3. format의 형식은 java의 decimal format을 사용합니다.

ORDER

  • 기능 : 데이터를 정렬합니다.

  • 옵션 :

옵션

기능

key

정렬할 필드를 선택합니다.

sort

정렬한 direction을 설정합니다. (asc or desc)

rows

같은 시간 값을 가지는 데이터를 최대 몇 개 남길지 설정합니다. default 10000

  • 예시 :

    -- key, sort, rows를 설정하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT [time, pname, host_ip, pid, httpc_count]
    ORDER {key: [pid, host_ip, httpc_count] , sort: [desc, desc, desc], rows:2}
    -- 두 번에 나누어서 정렬하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT [time, pname, host_ip, pid, httpc_count]
    ORDER {key: [pid, host_ip, httpc_count] , sort: [desc, desc, desc], rows:1000}
    ORDER  {key:tps, sort:desc}
  • 주의사항 :

    1. 데이터에 time 필드이 포함되는 경우에는 ORDER의 key에 time이 포함되어 있지 않아도 time이 정렬의 최우선 기준이 됩니다.

JOIN

JOIN <명령어>에 대한 설명에 앞서 join의 개념을 짚어보겠습니다. join은 두 쿼리문의 결과를 합쳐서 확인하기 위해서 사용합니다. 이 때 두 쿼리의 결과 중 어떤 필드를 기준으로 합칠지에 대한 정보를 전달해야하며, 이 필드를 pk 또는 primaryKey라고 합니다.

mxql 11
mxql 12
mxql 13

표1과 표2는 쿼리의 결과를 나타내며, pk로 지정된 file_name_4 필드는 파란색으로 표시되어 있습니다. 표3은 pk로 지정된 file_name_4를 기준으로 두 쿼리의 결과가 합쳐진 모습입니다.

  • 기능 : 두 MXQL에서 조회한 데이터를 합쳐서 볼 수 있습니다.

  • 예시 :

    -- 첫 번째 쿼리 : CATEGORY agent_list FLEXLOAD
    -- 두 번째 쿼리 : /app/act_tx/act_tx_oid
    -- RENAME 과 INJECT는 JOIN <명령어>가 수행된 결과를 가공하는 과정으로 join의 동작에는 영향을 미치지 않습니다.
    CATEGORY agent_list
    FLEXLOAD
    JOIN {query:'/app/act_tx/act_tx_oid', pk:oid, field:[act0,act3,act8, act] }
    RENAME {src:[act0, act3, act8, act], dst:[normal, slow, verySlow, total]}
    INJECT default
mxql 14
Figure 1. 위 샘플 쿼리의 결과 예시
Yard에 저장되는 모든 데이터는 time, oid의 값을 가지고 있습니다. 언제(time) 어떤 에이전트로부터(oid) 수집된 정보인지를 나타내기 위함입니다. 이 필드들도 pk로 사용될 수 있습니다.
  • 주의사항 :

    1. JOIN에 사용되는 첫 번째 쿼리는 직접 작성한 mxql 쿼리, 두 번째 쿼리는 path로 지정할 수 있는 쿼리(사전 정의 MXQL 쿼리문)만 가능합니다.

    2. JOIN문을 사용한 mxql 쿼리 전체를 Yard에 파일로 등록해서 사용하면 3개 이상의 카테고리도 JOIN할 수 있습니다.

LIMIT

  • 기능 : 추출되는 데이터의 수를 제한합니다. 앞에서부터 지정된 수만큼의 데이터를 다음 단계로 전달합니다.

  • 예시 :

    -- 가장 먼저 추출된 데이터 3개를 출력합니다.
    CATEGORY app_counter
    TAGLOAD
    LIMIT 3
  • 주의사항 :

SKIP

  • 기능 : 이전 단계로부터 전달받은 데이터 중 일부 데이터를 무시합니다.

  • 예시 :

    -- 1~5번째 데이터는 제외되고, 6번째부터 10개의 데이터를 보여줍니다.
    CATEGORY app_counter
    TAGLOAD
    SKIP 5
    LIMIT 10
  • 주의사항 :

FILTER-KEYS

  • 기능 : 특정 데이터를 가지고 있는 데이터만 추출합니다.

  • 예시 :

    CATEGORY app_counter
    TAGLOAD
    FILTERKEYS {keys : [oid], values : [497765289]}
  • 주의사항 :

    1. key, value가 아닌 keys, values입니다.(복수형 s에 주의합니다)

FIRST-ONLY

  • 기능 : 특정 데이터(쌍)을 가진 첫 데이터만 다음 단계로 전달합니다.

  • 예시 :

    CATEGORY app_counter
    TAGLOAD
    FIRST-ONLY {key:oid}
    CATEGORY app_counter
    TAGLOAD
    FIRST-ONLY {key: [httpc_count, type]}
    SELECT [httpc_count, type]
    CATEGORY app_counter
    TAGLOAD
    FIRST-ONLY [httpc_count, type]
    SELECT [httpc_count, type]
  • 주의사항 :

    1. 데이터 로드 단계에서 {backward : true }를 사용했다면 본 <명령어>의 결과가 달라질 수 있습니다.

TIME-FILTER

  • 기능 : 특정시간의 데이터를 SKIP할때 사용합니다.

  • 옵션 :

    옵션

    기능

    time

    "yyyy/MM/dd HH:mm:ss"로 지정합니다. 지정한 시간 기준 duration:1000가 설정됩니다. (지정한 시간 기준 1000ms동안의 데이터 제외)

    date

    "yyyy/MM/dd"로 지정해야합니다. 지정한 시간 기준 duration:d1이 같이 설정됩니다. (지정한 시간 기준 하루동안의 데이터 제외)

    duration or dur

    필터링 범위를 지정합니다.(d1: 1일, h1: 1시간 , m1,m5,m10: 1분,5분,10분 , 숫자: millisec)

    timezone

    데이터 타임존을 지정합니다. (ex 'GMT+9')

    gmt

    데이터 타임존을 지정합니다. (ex 9 or -9)

  • 예시 :

    CATEGORY app_counter
    TAGLOAD
    TIME-FILTER { date:'2020/07/28' , timezone:'GMT+9'}
    CATEGORY app_counter
    TAGLOAD
    TIME-FILTER {time:'2021/06/22 00:00:00', gmt:9 }

INJECT

  • 기능 : 해당 위치에 MXQL 쿼리를 추가합니다.

  • 예시 :

    -- default 위치에 inject될 MXQL 쿼리를 전달해야 합니다.
    CATEGORY app_counter
    TAGLOAD
    SELECT
    INJECT default
    ROWNUM
  • 주의사항 :

    1. 프론트 단에서 INJECT <명령어>의 <오퍼랜드>에 맵핑될 정보를 전달해주어야 합니다. 아래 예제는 키가 default로 설정된 값을 추가합니다.

      mxql example 5
      Figure 2. '사이트 맵 > MXQL 데이터 조회’에서 INJECT 값 전달하는 예시

ADJUST

  • 기능 : 숫자 필드의 값을 변경하기 위해 사용합니다. (time 값은 변경할 수 없습니다.)

  • 옵션 :

옵션 이름

옵션 기능

add

모든 숫자 데이터에 값을 더합니다.

sub

모든 숫자 데이터에 값을 뺍니다.

mul

모든 숫자 데이터에 값을 곱합니다.

div

모든 숫자 데이터에 값을 나눕니다.

over

모든 숫자 데이터에 최소값을 설정합니다.

under

모든 숫자 데이터의 최대값을 설정합니다.

  • 예시 :

    CATEGORY app_counter
    TAGLOAD
    SELECT
    ADJUST {mul : 100}
    -- over를 설정하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    ADJUST { key:[tx_count, tx_time], over:1000}
    -- under를 설정하는 경우
    ADJUST { key:[rate,sum], under:30}
    mxql 9
    Figure 3. 지정한 값 이상으로 설정 : ADJUST { key:[rate], over:30}
    mxql 10
    Figure 4. 지정한 값 이하로 설정 : ADJUST { key:rate, under:30}

FILTER

  • 기능 : 특정 조건을 가지고 있는 데이터만 다음 단계로 전달합니다.

  • 옵션 :

옵션 이름

옵션 기능

expr

조건을 수식으로 입력합니다.

value

특정 값을 가지고 있는 데이터를 찾습니다.

exist

값이 있는 데이터를 찾습니다.

notexist

값이 없는 데이터를 찾습니다.

over

특정 값보다 같거나 큰 데잍러를 찾습니다.(greater or equal to)

under

특정 값보다 같거나 작은 데잍러를 찾습니다.(less or equal to)

  • 예시 :

    -- expr 옵션을 적용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    FILTER {expr : "tx_count != 0"}
    -- value 옵션을 적용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    FILTER { key : tx_count, value : 5}
    -- exist 옵션을 적용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    FILTER { key : tx_count, exist : true}
    -- exist 옵션을 적용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    FILTER { key : tx_count, notexist : true}
    -- under 옵션을 적용하는 경우
    CATEGORY app_counter
    TAGLOAD
    SELECT
    FILTER { key : tx_count, under : 6}
  • 주의사항:

    1. 데이터가 0인 경우도 데이터가 존재하는 경우입니다. {exist: true}에 적용됩니다.

    2. {exist : false}와 {notexist : false}는 불가능합니다. {notexist : true}와 {exist : true}를 사용해주세요.