본문 바로가기
소프트웨어 마에스트로/BackEnd(Django)

[백엔드] django sentry log 손보기 + testcode 개편

by alpakaka 2024. 8. 23.

어제 중간평가 끝나서 좀 쉬고 오늘 다시 시작해본다!

 

할 일

sentry 손보기

testcode 리팩토링 (하드코딩 비중 줄이기 + 파일 좀 더 작게 쪼개기)

prompt 고민하기

 

일단 sentry 를 손봐본다.

지금까지의 문제는 다음과 같다.

로그는 잘 찍히지만 앞단에서 오류가 발생했을 때 찾을 수가 없다.

400인지 200인지, 400 이라면 왜 떴는지 그리고 무엇보다 메소드가 안보인다.

저번에도 이 로그로 파악하려니 그냥 서버 들어가서 로그 확인하는게 더 빨랐다.

 

그래서 파악이 잘 되도록 메소드 이름과 이때의 response 를 보여주는 작업을 시작해본다.

 

려고 했으나 포기했다.

시도한 사항

1. docs 잘 뒤져보기 -> 발견 못했다..

https://docs.sentry.io/product/explore/metrics/

 

Metrics

Metrics help you track and visualize the data points you care about, making it easier to monitor your application health and identify issues.

docs.sentry.io

 

2. chatgpt 에게 물어보기 ( 하지만 못 찾았다.. UI에서 설정할 수 있다고 해서 다시 docs 를 찾았지만 못 찾았다..)

3. github에서 사용한 예시있는지 찾아보기 -> 자료가 다 똑같은 공식 docs 를 가르키고 있었고.. 따라해봤지만 뭔가 되었지만 원하는 상황은 아니였다.

 

그래서 현재 상황은 metrics 를 추가했다.

cpu사용량, api call 수, 등등이 나오도록 변경해보았다. 나머지는 잘 모르겠다..

 

 

적다보니 내가 찾는 쪽은 Trace 였다는 사실을 다시 상기하고 찾아보았다.

https://docs.sentry.io/platforms/python/tracing/instrumentation/custom-instrumentation/requests-module/

 

Instrument HTTP Requests | Sentry for Python

Learn how to manually instrument your code to use Sentry's Requests module.

docs.sentry.io

 

일단 여기에 나와있는 코드를 작성해봤다.

views.py 에 있는 모든 코드들에 넣을것이니 좀 보편적으로 사용될 수 있게 약간만 수정했다.

def sentry_data(method, url, status_code, headers):
    span = sentry_sdk.start_span(
        op="http.request",
        description="%s %s" % (method, url),
    )

    span.set_data("http.reqeust.method", method)

    span.set_data("http.request.url", url)

    span.set_data("http.response.status_code", status_code)
    span.set_data("http.response_content_length", headers["content-length"])

    span.finish()

 

그리고 일단 가장 사용하기 쉬운 todo 를 가져오는 함수에 넣고 절차를 확인해봤다.

 

달라지는 게 하나도 없다.

 

뭔가 status_code, content_length 이런 것도 넣었는데, 아래의 sentry 를 연결하면 보여주는(어떠한 설정도 하지 않은) 화면과 차이를 모르겠다

 

일단 나머지 하고 다시 해봐야할 것 같다.

 

테스트코드를 리팩토링한다!

하드코딩 되었던 테스트코드..

이 친구를 이런식으로 변경했읍니다..

저기 order 의 경우에 조금 헤맸는데

처음에 fixture 가 따로 인자를 못받는다는 말을 듣고 지피티에게 물어보니 아래의 해답을 주었다.

@pytest.fixture
def order():
    orders = ["0|azzzzz:", "0|hzzzzz:", "0|lzzzzz:"]

    def get_order(index):
        return orders[index]

    return get_order

이런식으로 주면 인덱스로 호출이 되었다

 

이제 두번째로 약 한 파일당 300줄 가량의 코드인 상태인데 이것을 다시 잘 나눠볼 예정이다.

일단 코파일럿에게 물어본 결과 method 별로 나누라고 해서 일단 이렇게 한번 해보았다.

 

흠.. 일단 모든 파일이 200줄 이내로 들어갔으니.. 일단 테스트코드 개선은 여기까지 해도 괜찮을 것 같다.

 

아 그리고 우리 모델의 경우 on_delete 가 cascade 로 설정되어있다.

일단 soft delete 방식이라 client 단에서 db 내에서 삭제되는 경우는 적을 것이라 생각은 되는데

https://hunstory.tistory.com/69

 

[Django] Django model on_delete 종류

목차on_delete란? ForeignKey의 on_delete 옵션은 참조되는 객체가 삭제되면 Django 인수에 의해 지정된 SQL 제약 조건의 동작이다. on_delete 종류1. CASECADE: 참조된 객체가 삭제 될 때 해당 객체도 함께 삭제

hunstory.tistory.com

일단 팀원분들과 이야기는 해봐야할 것 같다.

일단 내 생각은 protect 가 맞을 것 같지만..? (soft delete 라.. 삭제되는 걸 하나도 고려하지 않았드아...)

소프트 delete 방식이라 참조하고 있는 객체가 삭제되는 걸 방지할 수 있다고 생각했다.

일단 소프트로 사용하고 있는 경우가 데이터를 좀 더 보존할 수 있기 때문이기도 했고..

하지만,

팀원분들에게 얘기해보고 수정해야할 것 같다.

 

prompt 관련으로 공부하기

https://github.com/anthropics/courses/blob/master/prompt_engineering_interactive_tutorial/README.md

 

courses/prompt_engineering_interactive_tutorial/README.md at master · anthropics/courses

Anthropic's educational courses. Contribute to anthropics/courses development by creating an account on GitHub.

github.com

여기 너무나 잘 나와있다. 멘토님이 추천해주셨는데 열심히 공부해야할것같다.

 

일단 이것저것 따라해봤는데 당연히 claude 3.5 인가 결제하고 사용하고 있어서 사용할 수 있는 줄 알았는데

openAI APi 쓸때와 마찬가지로 뭔가 다른 곳인 것 같다. 따로 또 결제해야하는 시스템인것같다. 흠..

그래서 오늘은 여기까지..

https://console.anthropic.com/dashboard