Skip to content

Feature/jaekyung/langchain tool - #11

Merged
OstenHun merged 9 commits into
developfrom
feature/jaekyung/langchain-tool
Sep 30, 2026
Merged

OstenHun merged 9 commits into
developfrom
feature/jaekyung/langchain-tool

Conversation

@worud8457

Copy link
Copy Markdown

초기 mysql plugin

@worud8457

Copy link
Copy Markdown
Author

도구 확장 커밋 검증 (2026-09-18)

3dd4b33을 feature/jaekyung/langchain-tool에 푸시했습니다. Prometheus 12개와 ProxySQL 13개 도구, 공통 실행 검증, 로컬 검증 스크립트·문서를 포함합니다.

커밋 대상만 별도로 추출한 환경(macOS / Node v26.5.0)에서 npm test 49개 통과, npm run typecheck, npm run build, git diff --cached --check 통과를 확인했습니다. 전체 로컬 작업본의 50개 테스트와 달리 리포트 변경 테스트 1개는 이 커밋에 포함하지 않았습니다.

기존 MySQL prepared binding·timeout·출력 제한·오류 정제·connection cleanup 회귀 테스트도 통과했습니다. 기존 실제 MySQL 병렬 상세 조회 실패 원인은 이번에 해결/재검증하지 않았으므로 #13 마지막 항목은 미체크로 유지합니다.

진단 출력 계약, Discord 출력 변경 및 tool_call_id 구현은 제외했습니다. develop 병합이나 서버 배포는 하지 않았습니다. 이전 live 검증 및 한계는 docs/prometheus-proxysql-tools.md를 참고하세요.

@OstenHun OstenHun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

검토 결과

변경을 요청합니다. 3dd4b331 기준으로 진단 상태 판정과 읽기 전용 도구의 안전 경계에서 수정이 필요한 4건을 확인했습니다. 아래 항목은 모두 현재 코드 경로 또는 가짜 입력·소스로 재현했습니다. 실제 AMDB와 운영 환경에서는 실행하지 않았습니다.

수정이 필요한 항목

  1. [P1] 장애를 no_problem_detected로 표시할 수 있습니다. 새 도구는 성공 시 rawResult를 반환하지만, 진단 조립은 observation만 수집합니다. 표시기는 비어 있는 관찰값을 보고, 도구 오류가 없으면 no_problem_detected를 반환합니다. 관찰값이 없고 중대 preliminary finding이 있는 가짜 진단에서 이 상태를 재현했습니다. LangChain 경로의 성공 응답이 장애를 정상으로 표시하지 않도록 결과 계약과 상태 판정을 함께 확인해 주세요.

  2. [P1] 원문 SQL에 든 미등록 비밀값이 모델에 전달됩니다. 카탈로그는 프로세스·트랜잭션의 SQL 원문을 반환합니다. MySQL 어댑터는 환경변수에 등록된 비밀값과 일부 형식만 검사하고, 래퍼는 성공 결과를 그대로 모델에 보냅니다. 가짜 currentStatement에 환경변수에 없는 비밀 문자열을 넣자 ok: true와 원문이 반환됐습니다. 원문 SQL을 전달하지 않거나, 전달 전에 검증 가능한 비밀값 처리 경계를 적용해 주세요. ProxySQL의 info·digest_text도 같은 출력 경계에서 점검이 필요합니다.

  3. [P1] Run당 호출 한도와 순차 실행이 적용되지 않습니다. 래퍼는 동일 도구·동일 입력만 중복으로 막습니다. 서로 다른 입력 9개를 가짜 도구에 동시에 보내자 9개 모두 실행됐고 최대 동시 실행 수도 9였습니다. 현행 PRD의 최대 8회 및 순차 실행 계약을 넘습니다. 거부된 시도까지 포함한 Run 단위 호출 예산과 실행 순서를 검증해 주세요.

  4. [P1] health URL에 file://을 지정해도 로컬 셸 명령이 생성됩니다. 새 health 도구는 설정값을 curl에 전달하고, 명령 생성은 URL 방식을 검사하지 않습니다. 가짜 설정값 file:///etc/passwd로 curl ... 'file:///etc/passwd'가 생성됨을 확인했습니다. 실제 파일 읽기는 실행하지 않았습니다. 설정 오류나 오염이 컨테이너 파일 내용을 모델 응답으로 바꾸지 못하도록 HTTP(S) URL과 대상 범위를 실행 전에 제한해 주세요.

검증 및 별도 차단 사항

  • Windows 사용자 컨텍스트, Node 24.13.0에서 npm run typecheck와 npm run build는 통과했습니다.
  • npm test는 실패했습니다: 37개 통과, 셸 테스트 1개 실패, MySQL 테스트 파일 로딩 1개 실패입니다. MySQL 테스트의 .pathname이 Windows에서 C:\C:\... 경로를 만들어 해당 파일의 테스트 11개가 시작되지 않았습니다. 셸 테스트는 Windows에 없는 /bin/sh 실행을 기대합니다. 이는 위 4건과 별개인 테스트 이식성 문제입니다.
  • 작성자 댓글의 macOS 테스트 49개 통과는 작성자 검증 결과입니다. 이번 검토에서는 라이브 AMDB·Docker 통합 검증을 미실행했습니다. 현재 head에는 CI 체크가 없고, PR은 병합 충돌 상태입니다.

위 4건을 수정한 새 head에서 상태 판정, 비밀값 차단, URL 방식 제한, 호출 예산·순차 실행을 회귀 테스트로 확인한 뒤 다시 검토하겠습니다.

OstenHun and others added 2 commits September 24, 2026 21:38
raw 결과를 보존하고 근거 부족 시 정상 판정을 방지한다. SQL 본문을 생략하고 health URL을 HTTP(S)로 제한한다.

호출 예산은 요청에 따라 진단 전체가 아닌 도구별 8회로 적용하며 입력 변경으로 횟수가 초기화되지 않게 한다. 순차 실행과 회귀 테스트를 추가한다. 기존 PRD의 전체 8회 제한과는 다른 정책이다.
@OstenHun
OstenHun dismissed stale reviews from themself September 25, 2026 06:55

사용자 요청에 따라 이번 추가 리뷰를 철회합니다.

@OstenHun OstenHun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] 9번째 도구 호출에서 진단 전체가 중단됩니다

같은 도구를 9번째 호출하면 wrapped.invoke()가 per_tool_call_budget_exhausted 예외를 반환합니다. 현재 코드에서는 이를 정제된 도구 결과로 전달하지 않아, 가짜 모델로 9개 호출을 요청한 실제 진단 경로에서 diagnose() 전체가 실패했습니다. 도구별 8회 제한은 유지하면서 9번째 호출은 원천 실행 없이 budget_exhausted 오류로 기록하고, 앞서 수집한 결과로 진단을 마칠 수 있게 해주세요. 이 경로를 에이전트 수준의 회귀 테스트로 확인하면 좋겠습니다.

도구별 8회 도달 시 선택 목록에서 제외하고 재호출에는 제한 응답을 반환한다. 다른 도구와 기존 결과로 진단을 계속한다.

Report 연동 테스트를 위해 SQL 본문 일괄 생략을 되돌린다. 기존 비밀값 검사는 유지하며 미등록 비밀값 처리 개선은 후속 과제로 남긴다. 테스트 59개, 타입 검사, 빌드 통과.
@OstenHun

OstenHun commented Sep 29, 2026 •

Copy link
Copy Markdown
Member

기존 리뷰 2번의 SQL 비밀번호 정제 문제가 남아 있습니다(P2).
AMDC 환경에 등록하지 않은 가짜 비밀번호를 currentStatement·info에 넣자, 같은 값이 진단 모델의 ToolMessage에 그대로 전달됐습니다. 실제 운영 비밀번호가 노출됐는지는 확인하지 않았습니다.

Report 입력 검사로는 그 전에 발생한 전달을 막을 수 없으므로, Tool Core에서 SQL 원문을 제외하거나 비밀번호를 정제한 뒤 모델에 보내도록 수정해 주세요.
같은 합성 데이터로 비밀번호가 ToolMessage에 남지 않는 회귀 테스트도 추가해 주세요.

MySQL 및 ProxySQL의 currentStatement, info, digest_text를 파서로 정제한다. 지원하는 SQL 구조는 보존하고 미지원·잘린 문장은 생략한다. 식별자 자체의 비밀값 탐지는 범위에 포함하지 않는다.

가짜 SQL의 최종 ToolMessage 검사 포함 테스트 63개, 타입 검사, 빌드 통과. 실제 DB나 모델은 호출하지 않았다.
@OstenHun
OstenHun merged commit ec1db60 into develop Sep 30, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants