0. 들어가며

Elasticsearch는 기본적으로 UTC 타임존을 사용하여 데이터를 저장합니다. 이는 시스템 간 일관성을 유지하는 데 유리하지만, 사용자나 클라이언트가 있는 지역에 맞춰진 로컬 타임존으로 데이터를 보여줘야 하는 경우에는 불편할 수 있습니다. 특히 Kibana와 같은 시각화 프로그램은 타임존을 자동으로 변환하여 표시하지만,

ElastAlert2는 기본적으로 이 기능을 제공하지 않기 때문에 알람에 표시되는 시간이 UTC로 나타납니다.

키바나 Discover에 표시되는 timestamp와 실제 document에 보여지는 timestamp
alert발송시 UTC timestamp를 나타내고있다.

1. Enhancement Module

ElastAlert2에서는 알람 발송 전에 사용자의 환경 또는 니즈에 맞춰서 알람 match를 변경할 수 있는 enhancement 모듈을

지원합니다. 이를 통해 타임스탬프 데이터를 알람이 전송되기 전에 적절한 타임존(KST)으로 변환할 수 있습니다.

 

2. 디렉토리/파일 생성

먼저 ElastAlert2의 디렉터리에 아래와 같은 구조로 디렉터리를 생성합니다.

[root@test ~]# cd /elastalert
[root@test elastalert]# mkdir elasticalert_modules
[root@test elastalert]# cd elasticalert_modules/
[root@test elasticalert_modules]# touch __init__.py
[root@test elasticalert_modules]# touch time_enhancement.py
[root@logmonitor elasticalert_modules]# ll
합계 0
-rw-r--r-- 1 root root 0  9월 25 12:25 __init__.py
-rw-r--r-- 1 root root 0  9월 25 12:26 time_enhancement.py

 

 

3. time_enhancement.py 작성

이제 타임존을 변환하는 실제 코드를 작성합니다.앞서 미리 생성해 둔  time_enhancement.py 파일을 수정하여 , ElastAlert2의 elastalert_modules 디렉터리에 저장합니다.

[root@test elastalert]# vi elastalert_modules/time_enhancement.py


from datetime import timedelta, timezone 
from elastalert.enhancements import BaseEnhancement  
from elastalert.util import pretty_ts, ts_to_dt

class TimeEnhancement(BaseEnhancement):

    def process(self, match):
        # 매치에 '@timestamp' 키가 있으면 실행
        if '@timestamp' in match:
            # +9시간(KST: Korean Standard Time) 오프셋을 가진 타임존 생성 ('KST'라는 이름 지정)
            KST = timezone(timedelta(hours=+9), 'KST')
            
            # '@timestamp' 값을 datetime 형식으로 변환
            timestamp = ts_to_dt(match['@timestamp'])
            
            # UTC 시간에서 KST 시간으로 변환한 후, 사람이 읽기 쉽게 포맷하여 'timestamp_kst'에 추가
            match['timestamp_kst'] = pretty_ts(timestamp.astimezone(KST), False)

 

이 코드는 다음과 같이 작동합니다:

  1. 타임스탬프 확인: match 데이터에 @timestamp 필드가 존재하는지 확인합니다. 이 필드가 없으면 타임존 변환이 실행되지 않습니다.
  2. KST 타임존 생성: timezone과 timedelta를 사용하여 UTC+9 시간대에 해당하는 한국 표준시(KST)를 정의합니다.
  3. 타임스탬프 변환: ts_to_dt 함수로 @timestamp 값을 datetime 객체로 변환합니다.
  4. UTC → KST 변환: datetime 객체의 astimezone() 메서드를 사용해 UTC 시간을 KST 시간으로 변환합니다.
  5. KST 시간 추가: 변환된 KST 시간을 사람이 읽기 좋은 형식으로 포맷한 후, timestamp_kst라는 이름으로 match에 추가합니다. 

4. Rule 설정

ElastAlert2의 규칙(rule) 파일에 enhancements 옵션과 선언한 timestamp_kst를 추가하여

위에서 작성한 TimeEnhancement 클래스를 호출하도록 설정하면, 알람이 전송될 때 자동으로 로컬 타임존으로

변환된 시간이 포함됩니다.

[root@test elastalert]# vi rules/file_integrity_rule.yaml
###########중략###############

match_enhancements:
- "elastalert_modules.time_enhancement.TimeEnhancement"
# "filepath.filename.modulename(classname)"으로 작성

#@timestamp,timestamp_kst 각각 출력
alert_text_args: ["timestamp_kst","@timestamp"]
alert_text_type: alert_text_only
alert_text : |
  time : {0}
  UTC : {1}
###중략####

5. 마무리

위와 같이 기본적으로 UTC로 저장되는 Elasticsearch 데이터를 Elastalert2의 enhancement 모듈을 통해 

로컬 타임존으로 변환하여 사용자에게 알맞은 시간대에 맞춰 알람을 전송할 수 있습니다.

 

6. 참고 URL

https://elastalert2.readthedocs.io/en/latest/recipes/adding_enhancements.html#enhancements

 

 

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

 

파이썬으로 자동화 프로그램 작업 중 위와 같은 에러가 발생하여 확인해보니 아래와 같은 이슈로 보여진다.

 

윈도우 환경에서 폴더경로를 그대로 복사하면, 경로내에 escape특수문자인 \(백슬래시)가 들어가있어서 문제가 발생한다.

 

아래와 같이 조치할수있다.

 

1) \(백슬래시) => /(슬래시)로 변경

path = 'C:/Users/Desktop/python'

 

2) r옵션을 통해 문자열 선언

path = r'C:\Users\Desktop\python'

 

강의 회차 : #5.4 Inheritance ~#5.7 Code Challange

1. Inheritance(상속)

상속이란, 클래스의 Method들을 클래스간에 공유 하는 기능으로써 반복 작업을 제거해주는 객체지향프로그래밍의 중요한 기능중 하나이다. 각 Class에 대해 반복적인 프로퍼티가 있을경우 상속을 하여 반복작업을 제거 해준다.  아래와 같이 Class 선언시 상속 Class를 적어주면 된다. 

class ClassName(InheritanceClassName):

 

상속을 받은 Class에서 __init__Method가 없을경우 자동으로 부모Class의 init Method를 호출한다. 

init을 선언할때 super()를 통해 아래와  같이 부모class의 init method를 참조할수있다 

class Dog:
    def __init__(self, name,breed , age):
        self.name = name
        self.breed = breed
        self.age = age

class GuardDog(Dog):
    def __init__(self, name ,breed):
        super().__init__(name,breed,5)

    def rrrrr(self):
        print("stay away!")

class Puppy(Dog):
    def __init__(self,name,breed):
        super().__init__(name, breed, 0.1)

    def woofwoof(self):
        print("woof woof!")

ruffus = Puppy(
    name = "ruffus",
    breed = "beagle",

)

bibi = GuardDog(
     name = "bibi",
    breed = "dodog",
)

ruffus.woofwoof()

 

class Puppy와 GuardDog는 Dog 클래스를 참조하게 되어있고, name,breed,age를 상속 받는다. 그리고 각 GuardDog와 Puppy는 supper().__init__()을 통해서 age의 값을 따로 선언하게끔 되어있다

'Study > Python' 카테고리의 다른 글

Python 공부 8일차  (0) 2024.04.03
Python 공부 7일차  (0) 2024.03.26
Python 공부 6일차  (0) 2024.03.14
Python 공부 5일차  (0) 2024.03.13
Python 공부 4일차  (0) 2024.03.10

강의 회차 : #5.0 Introduction ~ #5.3 Methods

 

1. OOP(object oriented programming)

 

OOP는 데이터를 기반으로 동작하는 함수로 데이터를 캡슐화 할수있다.

OOP를 사용하면 다른 종류의 데이터와 함수들을 모두 하나의 파일에 가지고 있는 것보다 데이터를 더 구체적으로 구성할 수 있습니다. 이를 Box, Object, Bubble 등으로 부를 수 있습니다.

함수와 데이터구조(리스트,튜플,딕셔너리)들이 연결 관계에 있게끔 구성하는게 아닌,

각각의 우리의 데이터를 어떻게 구조화 해야하는지 알려주고, 그 데이터를 수정하기 위해 어떤 함수를 사용해야하는지 안내해주며, 이는 명확한 수준의 경계를 말해준다고 볼수있다. 

 

 

2. Class

Class란 데이터와 데이터를 처리하는 함수들을 함께 묶어놓은것이며 이를 통해 데이터 구조화를 도와준다. 

선언하는 방법은 아래와 같이 간단하다.

class Puppy:

 

3. Methods

간단히 정의하면 함수가 class 밖에 있으면 함수 안에 있으면 method다

method의 가장 중요한 규칙은 아래와 같다

클래스 내 어떠한 메쏘드던지 첫번째 아규먼트는 자동적으로 자기 자신(self)을 첫번째 아규먼트로 받는다.

그 예시를 보자면

class Puppy:

  def __init__(self, name, breed):
    self.name = name
    self.breed = breed
    
ruffus = Puppy("ruffus","beagle")

print(ruffus.name,ruffus.breed)

결과 값은 아래와 같다

 

즉, ruffus를 선언할때 Puppy Class를 호출하는데, Method내 첫번째 아규먼트인 self는 ruffus 자체가 된다는 의미이다.

 

 

 

'Study > Python' 카테고리의 다른 글

Python 공부 9일차  (0) 2024.04.28
Python 공부 7일차  (0) 2024.03.26
Python 공부 6일차  (0) 2024.03.14
Python 공부 5일차  (0) 2024.03.13
Python 공부 4일차  (0) 2024.03.10

강의 회차 : #4. 3  For Loops ~#4.9 Recap

 

1. For Loops

 

기본포맷

for 변수 in 데이터:
	조건문 또는 실행문

 

반복문으로써 tuple list dic등 데이터구조에서 각 아이템을 활용해서 코드를 실행하기 위한 구문

for문 안에는 다양한 조건문 또는 실행문을 작성할수있다.

변수는 아무 변수나 선언이 가능하나 해당 변수는 불러온 데이터구조의 각 아이템을 의미한다.

websites = (
	"google.com",
    "airbnb.com",
    "https://twitter.com"
)

for items in websites
	print(f"현재 item은 {items},입니다")

실행 결과값은 아래와 같다.

items라는 변수가 websites lists의 각각의 아이템을 가져오는것을 확인 할 수 있다.

 

 

2. PYPI

PYPI란?

파이썬 표준라이브러리에서 제공하지않는 개발자가 자체 개발한 모듈들을 찾을 수 있는 사이트다.

다양한 모듈이 개발되어있어, 앞으로 개발공부를 하면서 많이 참조할듯하다.

 

3. Requests

 

Requests는 PYPI에서 다운로드할수 있는 라이브러리로써 get과 post등 http의 method를 사용 할 수 있는 라이브러리이다. 아래와 같이 import하여 사용이 가능하며 from import를 통해 특정 함수(get)만 사용도 가능하다.

import requests

from requests import get

get 함수를 이용한 예제

 

4.  예제풀이

 line 1 : requests module의 get function을 import 한다.

 line 3: websites list를 선언한다.

 line 11 : results 라는 빈 dictionary를 선언한다.

 line 15 : for loop를 통해 websites 리스트를 반복문내에 website 변수로 선언하며 반복문 실행

 line 16-17 : if not 구문을 통하여, website변수(string)의 startswith method를 통해 https://로 시작여부를 bool로 받는다. 이경우 if not 이기때문에, https://로 시작하지 않는 string변수에 한해 조건문 하단 실행문을 실행한다.(실행문 : website 변수앞에 https://를 추가.)

 line 19 : response변수를 선언하여 import했던 get함수를 통해 website 변수를 호출한다.

 line 20-21 : response변수의 status_code가 만약 200일 경우 results dictionary에 키에 대한 값을(OK) 추가한다.

 line 22-23 : response변수의 status_code가 200외의 값일 경우에 results dictionary에 키에 대한 값(FAILED)을 추가한다

 line 25 : results dictionary를 전부 print한다.

'Study > Python' 카테고리의 다른 글

Python 공부 9일차  (0) 2024.04.28
Python 공부 8일차  (0) 2024.04.03
Python 공부 6일차  (0) 2024.03.14
Python 공부 5일차  (0) 2024.03.13
Python 공부 4일차  (0) 2024.03.10

+ Recent posts