스플렁크에서 문자열을 쓰는 방식 중 가장 많이 쓰는건 아무래도 + 기호다.
|makeresults
|eval 결과="문"+"자"+"열"
+ 기호는 C 시절 부터 Python까지 프로그래밍 언어에서도 문자열을 합치는 유구한 방식이고,
직관성이 높기도 하다.
거기다가 Splunk는 많은 부분이 Python으로 돌아가는 프로그램이라서 인지는 몰라도,
형변환에서 매우 자유롭다.
|makeresults
|eval 값1="문자", 값2=2, 값3=3
|eval 결과1= 값1 + 값2, 결과2=값2+값3
결과 1과 결과2 모두 무리없이 출력된다.
결과1은 문자열로 계산해 합쳐지고, 결과2는 숫자로 계산해 합쳐진다.
그렇기 때문에 항상 + 기호만 써도 문제 없을 것 같다.
하지만 문제는 eval의 결과 값을 얻기 위해 문자열에 숫자 계산식을 넣을 경우 발생한다.
|makeresults
|eval 오늘가격=10000, 어제가격=8000
|eval 증감안내="오늘의 가격은 어제 대비 " + abs(round(1-오늘가격/어제가격,2)*100) + "% " + case(오늘가격 > 어제가격, "올랐네요", 오늘가격 < 어제가격, "내렸네요"))
이 쿼리를 보면 직관적으로 "오늘의 가격은 어제 대비 25% 올랐네요" 라는 결과값이 나와야 할 것 같다.
하지만 나오지 않는다.
대신
Error in 'eval' command: Type checking failed. '+' only takes two strings or two numbers
이란 경고문을 띄우며 결과값이 나오지 않는다.
스플렁크엔 형변환 따위 필요없이 찰떡같이 알아들을 줄 알았는데 아니었나?
어지간해선 맞는 말이지만
abs(숫자) - 절대값으로 만드는 함수, round(숫자,자리수) - 자리수 만큼 반올림해주는 함수
이 두 개는 결과값이 숫자형으로 고정되어 나오는데 앞 뒤엔 문자열이 나오는게 문제다.
사실 개인적인 생각으론 그냥 찰떡같이 알아서 숫자형 결과를 문자열로 바꿔줬으면 좋겠지만
그렇다고 한다.
그래서 평소에 잘 안쓰던 한 가지 방식을 쓰는데
그것이 바로 마침표다.
|makeresults
|eval 오늘가격=10000, 어제가격=8000
|eval 증감안내="오늘의 가격은 어제 대비 ".abs(round(1-오늘가격/어제가격,2)*100)."% " + case(오늘가격 > 어제가격, "올랐네요", 오늘가격 < 어제가격, "내렸네요"))
마침표는 대상이 숫자이던 문자열이던 무조건 문자열로 변환해 이어붙인다.
이를 통해 원래부터 원하던 결과인
"오늘의 가격은 어제 대비 25% 올랐네요"
를 성공적으로 출력할 수 있다.
'Splunk Tip' 카테고리의 다른 글
다수의 다중 값 (Multivalue) 필드를 각각의 항으로 나누고 싶어요 (0) | 2023.08.25 |
---|---|
Splunk로 COUNTIF 같이 조건식 계산을 하고 싶어요! (0) | 2023.02.23 |
Splunk로 한 달 전 통계값과 지금 통계값을 비교하기 (0) | 2023.02.22 |
Splunk에서 리눅스 스크립트를 작성할때 CURL 35 에러가 발생한다면? (0) | 2023.02.14 |
Splunk로 효율적인 실시간 누적 통계 검색하기 (0) | 2023.02.07 |