Skip to content

feat(observability): Token Pilot 고유 지표를 추가한다 - #70

Closed
HuitaePark wants to merge 1 commit into
mainfrom
feat/issue-40-tokenpilot-metrics
Closed

feat(observability): Token Pilot 고유 지표를 추가한다#70
HuitaePark wants to merge 1 commit into
mainfrom
feat/issue-40-tokenpilot-metrics

Conversation

@HuitaePark

Copy link
Copy Markdown
Member

요약

  • 비용, preflight, 예약, 정산 오차/결과, pricing miss, listener failure, notification lifecycle을 다루는 Token Pilot 고유 Micrometer 지표 8종을 추가했습니다.
  • core/budget/notification 소유 모듈에 framework-independent 이벤트·리스너를 두고, 관측 리스너 실패가 완료된 회계 전이를 되돌리지 않도록 격리했습니다.
  • owner별 자동설정을 분리해 선택 모듈이 없는 classpath에서도 core 자동설정이 안전하게 기동되며, legacy ai.token.* 지표는 명시적 opt-in으로만 활성화됩니다.
  • core-only/all-owners/autoconfigure-core-only 외부 소비자 검증과 POM 의존성 검증을 추가했습니다.

주요 동작

  • 비용은 새로 적용된 actual COMMITTED 정산만 집계합니다.
  • actual usage가 없으면 0 오차 대신 reconciliation_required 결과를 발행합니다.
  • 새 지표의 기본 tag는 bounded enum/등록 식별자만 사용하고 사용자 tag whitelist 기본값은 비어 있습니다.
  • 기존 MicroCostMetricsPublisher 직접 생성자는 호환성을 유지합니다.
  • 선택 budget 모듈 classloading을 위해 TokenPilotProperties.toBudgetPolicy()TokenPilotBudgetPolicyFactory.from(...)으로 이동했으며 README에 migration을 기록했습니다.

검증

  • ./gradlew test verifyCompatibilityMatrix verifyCoreConsumer verifyMicrometerConsumer
  • ./gradlew publishToMavenLocal
  • git diff origin/main...HEAD --check
  • 독립 코드 리뷰: P0-P2 finding 없음

Closes #40

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 48 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8baa33b3-24e1-4aa1-b295-79c0207448c3

📥 Commits

Reviewing files that changed from the base of the PR and between 0c74ee7 and 1a3610c.

📒 Files selected for processing (64)
  • AGENTS.md
  • README.md
  • build.gradle
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotBudgetPolicyFactory.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotCoreMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotNotificationAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotNotificationMetricsAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotProperties.java
  • token-pilot-autoconfigure/src/main/java/io/tokenpilot/autoconfigure/TokenPilotSpringAiAutoConfiguration.java
  • token-pilot-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • token-pilot-autoconfigure/src/test/java/io/tokenpilot/autoconfigure/ChatClientBuilderCustomizerTest.java
  • token-pilot-autoconfigure/src/test/java/io/tokenpilot/autoconfigure/TokenPilotAutoConfigurationTest.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListener.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerErrorHandler.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerFailureEvent.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerPhase.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationAccountingListenerType.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/ReservationReconciliationRequiredEvent.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/InMemoryBudgetStateStore.java
  • token-pilot-budget/src/main/java/io/tokenpilot/budget/internal/LedgerBudgetComponents.java
  • token-pilot-budget/src/test/java/io/tokenpilot/budget/internal/ReservationAccountingListenerLifecycleTest.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/CoreComponents.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/PreflightDecisionListener.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/PricingMissingListener.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PreflightDecisionEvent.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PricingMissingEvent.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/domain/PricingResolution.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/DefaultLedgerManager.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/DefaultTokenBudget.java
  • token-pilot-core/src/main/java/io/tokenpilot/core/internal/LedgerComponents.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/domain/PricingMissingEventTest.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/internal/DefaultLedgerManagerTest.java
  • token-pilot-core/src/test/java/io/tokenpilot/core/internal/DefaultTokenBudgetTest.java
  • token-pilot-micrometer/build.gradle
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/MetricsOptions.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/BudgetMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/BudgetMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/CoreMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/LedgerMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/MicroCostMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/NotificationMetricsPublisher.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/NotificationMicrometerComponents.java
  • token-pilot-micrometer/src/main/java/io/tokenpilot/micrometer/internal/TokenPilotMeterMetadata.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/BudgetMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/CoreMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/LedgerMicrometerComponentsTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/MicroCostMetricsPublisherTest.java
  • token-pilot-micrometer/src/test/java/io/tokenpilot/micrometer/internal/NotificationMetricsPublisherTest.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationLifecycleEvent.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationLifecycleListener.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationOutcome.java
  • token-pilot-notification/src/main/java/io/tokenpilot/notification/BudgetNotificationService.java
  • token-pilot-notification/src/test/java/io/tokenpilot/notification/BudgetNotificationLifecycleEventTest.java
  • token-pilot-notification/src/test/java/io/tokenpilot/notification/BudgetNotificationServiceTest.java
  • token-pilot-sample-app/src/main/java/io/tokenpilot/sample/SampleController.java
  • token-pilot-sample-app/src/main/resources/application.yml
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationChatClientE2ETest.java
  • token-pilot-sample-app/src/test/java/io/tokenpilot/sample/SampleApplicationE2ETest.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/DefaultLedgerAdvisor.java
  • token-pilot-spring-ai/src/main/java/io/tokenpilot/springai/internal/LedgerSpringAiComponents.java
  • token-pilot-spring-ai/src/test/java/io/tokenpilot/springai/internal/DefaultLedgerAdvisorTest.java

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@HuitaePark

Copy link
Copy Markdown
Member Author

#70의 변경은 통합 PR #71에 포함되어 CI 검증을 완료했습니다. 이후 수정과 검토는 #71에서 이어갑니다.

@HuitaePark HuitaePark closed this Aug 25, 2026
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.

[Observability] TokenPilot 고유 Micrometer 지표 구현

1 participant