<ph type="x-smartling-placeholder"></ph>
현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서. 정보
증상
사용자가 Edge UI에서 트레이스 세션을 만들 수 없습니다.
오류 메시지
아래와 같이 Edge UI에 오류 메시지가 표시됩니다.
Error creating trace session for API proxy <api proxy name>, revision <revision number>, environment <environment name>.
Failed to create DebugSession <session number>
다음은 Edge UI에서 관찰된 샘플 오류 메시지의 스크린샷입니다.
가능한 원인
이 오류가 발생할 수 있는 원인은 다음과 같습니다.
원인 | 설명 | 해당하는 문제 해결 안내 |
네트워크 연결 문제 | 네트워크 연결 문제 또는 방화벽 규칙으로 인한 관리 서버와 메시지 프로세서 간의 통신 오류입니다. | Edge 프라이빗 클라우드 사용자 |
메시지 프로세서에 환경이 로드되지 않음 | trace를 사용 설정하려는 특정 환경이 오류로 인해 메시지 프로세서에 로드되지 않았습니다. | |
오래된 메시지 프로세서 항목 | 관리 서버가 존재하지 않는 (오래된) 메시지 프로세서를 참조합니다. | |
메시지 프로세서에 연결할 수 없음 | 메시지 프로세서가 중지되었거나 연결할 수 없습니다. | |
높은 리소스 사용률 문제 | 메시지 프로세서의 리소스(CPU, 메모리, 로드) 사용률이 높습니다. | |
API 프록시가 하나 이상의 메시지 프로세서에 배포되지 않음 | 배포 중에 이벤트 알림이 누락되어 API 프록시를 하나 이상의 메시지 프로세서에 배포할 수 없습니다. | |
Edge UI 문제 | 오류로 인해 Edge UI에서 트레이스 세션을 만들 수 없습니다. |
일반적인 진단 단계
다음 관리 API를 실행합니다.
curl -v <management-server-host>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/<revision-number>/debugsessions -u <user>
오류가 발생하면 기록해 둡니다. 네트워크 연결 문제로 이동합니다.
성공 응답이 수신되면 Management API를 통해 트레이스 세션을 만들 수 있음을 나타냅니다. 하지만 Edge UI에 트레이스 세션을 만들 수 없는 문제가 있을 수 있습니다. Edge UI 관련 문제로 이동합니다.
원인: 네트워크 연결 문제
진단
관리 서버 로그(
/opt/apigee/var/log/edge-management-server/logs/system.log
)를 살펴보고 추적/디버그 세션을 만드는 중에 오류가 있는지 확인합니다.관리 서버 로그의 샘플 오류
2018-02-08 09:08:21,310 org:myorg env:uat qtp1073741635-1074 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : createDebugSession : Unable to connect to the server with UUID cedeabd2-e4d1-40bb-8f18-d6afc8835e5b org.apache.http.conn.HttpHostConnectException: Connect to 10.84.75.92:8082 [/10.84.75.92] failed: Connection refused at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:140) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.5.jar:4.3.5] ...<snipped> Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_65] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_65] ...<snipped>
위의 샘플 오류는 관리 서버가 포트 # 8082의 메시지 프로세서에 연결을 시도할 때 "연결 거부됨" 오류가 발생하는 것을 보여줍니다. 따라서 관리 서버는 추적 세션을 만들 수 없습니다.
네트워크 연결과 관련된 오류 또는 위의 예와 유사한 오류가 표시되지 않으면 Environment not load on the Message Processor로 이동합니다.
네트워크 연결과 관련된 오류 또는 위의 예와 유사한 오류가 발생하면 다음 단계를 따르세요.
다음 단계에 따라 관리 서버에서 포트 8082의 메시지 프로세서로 연결을 테스트합니다.
텔넷을 사용할 수 있는 경우 텔넷을 사용합니다.
telnet <MessageProcessor_IP> 8082
Telnet을 사용할 수 없는 경우 다음과 같이 netcat을 사용하여 연결을 확인합니다.
nc -vz <MessageProcessor_IP> 8082
'연결 거부됨'이라는 응답을 받는 경우 다음 단계로 이동합니다.
오류가 표시된 해당 IP 주소로 각 메시지 프로세서에 로그인한 후 다음 단계를 수행하세요.
메시지 프로세서가 포트 8082에서 수신 대기 중인지 확인합니다.
netstat -an | grep LISTEN | grep 8082
메시지 프로세서가 포트 8082에서 수신 대기 중인 경우 7단계로 이동합니다.
메시지 프로세서가 포트 8082에서 수신 대기하고 있지 않으면 다음 명령어를 사용해 메시지 프로세서를 다시 시작하세요.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
다음 명령어를 사용하여 메시지 프로세서가 완전히 시작될 때까지 기다립니다.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor wait_for_ready
메시지 프로세서가 작동하면 메시지 프로세서가 포트 8082에서 수신 대기 중인지 다시 확인합니다.
메시지 프로세서가 포트 8082에서 수신 대기 중인 경우 7단계로 이동합니다.
이제 UI에서 트레이스 세션을 시작할 수 있는지 확인합니다. 문제가 더 이상 관찰되지 않으면 아래 단계를 건너뛰세요.
메시지 프로세서가 실행 중이고 포트 8082에서 수신 대기하고 있는데도 관리 서버와 같은 다른 서버에 연결할 수 없는 경우 방화벽이 외부 연결을 차단하고 있기 때문일 수 있습니다.
적절한 명령어를 사용하여 방화벽 규칙을 확인합니다. 예를 들어, iptables 명령어를 실행하여 시스템에 정의된 모든 방화벽 규칙을 나열할 수 있습니다.
iptables -L -n
포트 8082에 설정된 방화벽 규칙이 없는 경우 높은 리소스 사용률 문제로 이동합니다.
포트 8082에 설정된 방화벽 규칙이 있는 경우 아래의 해결 방법 섹션으로 이동합니다.
해결 방법
- 네트워크 관리자와 협력하여 외부 서버로부터 포트 8082의 인바운드/아웃바운드 트래픽을 허용합니다.
문제가 계속되면 진단 정보를 수집해야 함을 참고하세요.
원인: 메시지 프로세서에 환경이 로드되지 않았습니다.
진단
- 관리 서버 로그
/opt/apigee/var/log/edge-management-server/logs/system.log
를 살펴보고 트레이스/디버그 세션을 만드는 동안 오류가 있는지 확인합니다. 'MP(s)의 유효한 응답 없음'과 같은 오류 메시지가 표시될 수 있습니다. 아래와 같이 추적/디버그 세션을 만드는 중에 다음을 수행합니다.
2018-01-30 08:28:09,721 org:mynonprod env:uat qtp2007599722-712162 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : no valid responses from MP(s), throwing error 2018-01-30 08:28:09,723 org:mynonprod env:uat qtp2007599722-712162 ERROR REST - CustomJAXRSInvoker.performInvocation() : CustomJAXRSInvoker.performInvocation : Method com.apigee.distribution.DebugSessionAPI.createDebugSession threw an exception. 2018-01-30 08:28:09,724 org:mynonprod env:uat qtp2007599722-712162 ERROR REST - ExceptionMapper.toResponse() : Error occurred : Failed to create DebugSession 1517297564678 2018-01-30 08:28:09,724 org:mynonprod env:uat qtp2007599722-712162 ERROR REST - ExceptionMapper.toResponse() : Returning error response : ErrorResponse{errorCode = distribution.CreateDebugSessionFailed, errorMessage = Failed to create DebugSession 1517297564678}
이 오류는 메시지 프로세서가 어떤 이유로 관리 서버에 다시 응답하지 않음을 나타냅니다.
위의 예에 표시된 것과 유사한 오류가 표시되지 않으면 오래된 메시지 프로세서 항목으로 이동합니다.
위의 예와 유사한 오류가 발생하면 다음 단계를 따르세요.
이 오류의 가장 큰 원인 중 하나는 추적 세션을 만들려는 환경이 메시지 프로세서에 로드되지 않았기 때문일 수 있습니다.
각 메시지 프로세서에 로그인하고 추적 세션을 만들려는 특정 환경이 아래 명령어를 사용하여 메시지 프로세서에 로드되었는지 확인합니다.
curl -s http://localhost:8082/v1/runtime/organizations/<org-name>/environments
출력 예시:
위 명령의 출력에서 메시지 프로세서에 로드된 특정 조직에 속한 환경 목록이 표시됩니다. 예를 들어 preprod 및 test 환경이 메시지 프로세서에 로드되면 다음과 같은 출력이 표시됩니다.
[ "preprod", "test" ]
추적 세션을 만들려는 특정 환경(예: 'dev')이 위 명령어의 일부로 나열된 경우 오래된 메시지 프로세서 항목으로 이동합니다.
특정 환경(예: "dev")이 위 명령어의 일부로 나열되지 않는 경우 환경을 로드하는 동안 메시지 프로세서의
/opt/apigee/var/log/edge-message-processor/logs/system.log
및/opt/apigee/var/log/edge-message-processor/logs/startupruntimeerrors.log
에 오류가 있는지 확인하세요.메시지 프로세서에 환경을 로드하는 데 실패할 수 있는 다양한 오류가 발생할 수 있습니다. 해결 방법은 발생한 오류에 따라 다릅니다.
해상도
여러 가지 이유로 환경이 메시지 프로세서에 로드되지 않을 수 있습니다. 이 섹션에서는 이 문제를 일으킬 수 있는 몇 가지 이유를 설명하고 문제 해결 방법을 설명합니다.
메시지 프로세서 로그에 다음 오류 중 하나가 표시되면 이는 지정된 환경의 지정된 키 저장소/truststore에 추가된 인증서/키에 문제가 있기 때문일 수 있습니다.
오류 #1: java.security.KeyStoreException: 소유한 인증서를 덮어쓸 수 없음
2018-01-30 12:04:38,248 pool-47-thread-4 ERROR MESSAGING.RUNTIME - AbstractConfigurator.propagateEvent() : Error while handling the update for the Configurator com.apigee.kernel.exceptions.spi.UncheckedException: Failed to add certificate : mycert in key store : mytruststore in environment : test at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:156) ~[config-entities-1.0.0.jar:na] at com.apigee.entities.configurators.KeyStore.handleUpdate(KeyStore.java:101) ~[config-entities-1.0.0.jar:na] at com.apigee.entities.AbstractConfigurator.propagateEvent(AbstractConfigurator.java:85) ~[config-entities-1.0.0.jar:na] at com.apigee.messaging.runtime.Environment.handleUpdate(Environment.java:238) [message-processor-1.0.0.jar:na] … Caused by: java.security.KeyStoreException: Cannot overwrite own certificate at com.sun.crypto.provider.JceKeyStore.engineSetCertificateEntry(JceKeyStore.java:355) ~[sunjce_provider.jar:1.8.0_151] at java.security.KeyStore.setCertificateEntry(KeyStore.java:1201) ~[na:1.8.0_151] at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:153) ~[config-entities-1.0.0.jar:na] ... 20 common frames omitted 2018-01-30 12:04:38,250 pool-47-thread-4 ERROR MESSAGING.RUNTIME - AbstractConfigurator.rollbackTransaction() : Error in processing the changes : Unknown resource type cert
오류 #2: java.security.KeyStoreException: 보안 비밀 키를 덮어쓸 수 없음
2017-11-01 03:28:47,560 pool-21-thread-7 ERROR MESSAGING.RUNTIME - AbstractConfigurator.propagateEvent() : Error while handling the update for the Configurator com.apigee.kernel.exceptions.spi.UncheckedException: Failed to add certificate : mstore in key store : myTruststore in environment : dev at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:156) ~[config-entities-1.0.0.jar:na] at com.apigee.entities.configurators.KeyStore.handleUpdate(KeyStore.java:101) ~[config-entities-1.0.0.jar:na] ... Caused by: java.security.KeyStoreException: Cannot overwrite secret key at com.sun.crypto.provider.JceKeyStore.engineSetCertificateEntry(JceKeyStore.java:354) ~[sunjce_provider.jar:1.8.0_144] at java.security.KeyStore.setCertificateEntry(KeyStore.java:1201) ~[na:1.8.0_144] at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:153) ~[config-entities-1.0.0.jar:na] ... 20 common frames omitted 2017-11-01 03:28:47,562 pool-21-thread-7 ERROR MESSAGING.RUNTIME - AbstractConfigurator.rollbackTransaction() : Error in processing the changes : Unknown resource type cert
다음 관리 API 호출을 사용하여 이전 단계에 표시된 오류 메시지에 지정된 keystore/truststore의 세부정보를 가져옵니다.
curl -v "http://<management-IPaddress>:8080/v1/organizations/<org-name>/environments/<env-name>/keystores/myTruststore" -u <user>
출력 예:
{ "certs": [ "mycert", "mycert-new" ], "keys": [ "mycert" ], "name": "myTruststore" }
출력 예에서는 truststore myTruststore에 두 개의 인증서와 하나의 키가 있음을 보여줍니다. 트러스트 저장소에는 일반적으로 키가 포함되지 않습니다. 이러한 경우 단일 인증서와 단일 키를 사용하는 것이 좋습니다.
다음 API를 사용하여 두 인증서에 대한 세부정보를 가져옵니다.
curl -s http://<management-IPaddress>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/keystores/<keystore-name>/certs/<cert-name>
각 인증서의 만료일을 확인하고 만료된/이전 인증서를 확인하세요.
트러스트 저장소 'myTruststore'에서 만료되었거나 원치 않는 인증서를 삭제합니다.
문제가 계속 발생하거나 위의 1단계에서 언급한 것과 다른 오류가 표시되면 진단 정보를 수집해야 함으로 이동하세요.
원인: 오래된 메시지 프로세서 항목 또는 메시지 프로세서에 연결할 수 없음
진단
- Edge UI가 시간이 오래 걸리고 트레이스 세션을 만드는 데 실패하는 경우 가능한 원인은 다음과 같습니다.
<ph type="x-smartling-placeholder">
- </ph>
- 관리 서버가 존재하지 않는 (오래된) 메시지 프로세서를 지칭하는 것일 수 있습니다.
- 메시지 프로세서가 중지되었거나 연결할 수 없습니다.
- 메시지 프로세서가 메모리/CPU 사용량이 높습니다.
- 관리 서버 로그
/opt/apigee/var/log/edge-management-server/logs/system.log
를 확인하고 트레이스/디버그 세션을 만드는 중에 오류가 있는지 확인합니다. 'server <UUID>' 아래와 같이 추적/디버그 세션을 생성하는 동안 작동하지 않거나 연결할 수 없습니다.'라는 오류가 표시될 수 있습니다.
2017-12-27 07:42:38,975 org:cocacola env:prod qtp2007599722-222063 INFO DISTRIBUTION - DebugSessionAPI.createDebugSession() : server 458b5910-2646-441c-a6e2-428b6d84e021 is either not up or reachable, skipping the server
'연결 시간이 초과되었습니다'라는 오류가 1개 더 발생할 수 있습니다. 잠시 후 아래와 같이 다시 시작합니다.
2017-12-27 07:44:46.000 UTC org:cocacola env:prod qtp2007599722-222063 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : createDebugSession : Unable to connect to the server with UUID {}, skipping it458b5910-2646-441c-a6e2-428b6d84e021 org.apache.http.conn.HttpHostConnectException: Connect to 192.168.101.7:8080 [/192.168.101.7] failed: Connection timed out (Connection timed out) at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:140) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.5.jar:4.3.5] …<snipped> Caused by: java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_144] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_144] …<snipped>
다음 두 오류는 특정 메시지 프로세서로 인해 발생할 수 있습니다.
- 비활성 (더 이상 존재하지 않음)
- 어떤 이유로든 다운되었거나 연락할 수 없음
발생한 시나리오에 따라 적절한 해결 방법을 따르세요.
해상도
시나리오 #1 : 메시지 프로세서가 비활성(존재하지 않음)
아래 관리 API를 사용하여 메시지 프로세서 목록을 가져옵니다.
curl -u <sysadmin> "http://<management-server-host>:8080/v1/servers?pod=<podName>®ions=<regionName>"
Management Server 로그의 오류 메시지에 언급된 메시지 프로세서의 UUID에 해당하는 IP 주소 또는 호스트 이름을 기록해 둡니다(위 진단의 3단계). 다음 방법 중 하나를 사용하여 유효한 메시지 프로세서인지 확인합니다.
- 최신 프라이빗 클라우드 토폴로지 설정 다이어그램
- 최신 에지 서버 IP 주소 - 호스트 이름 매핑 테이블
유효한 메시지 프로세서로 확인되면 시나리오 2 : 메시지 프로세서에 연결할 수 없음으로 이동합니다.
아래의 관리 API를 사용하여 오래된 (존재하지 않는) 메시지 프로세서를 삭제합니다.
조직의 환경에서 메시지 프로세서를 등록 취소합니다.
curl -X POST http://<management-server-host>:8080/v1/o/<orgName>/e/<envName>/servers -d "uuid={uuid}®ion=<regionName>&pod=<podName}&action=remove"
서버 유형을 등록 해제합니다.
curl http://<management-server-host>:8080/v1/servers -X POST -d "type={message-processor}®ion=<regionName>&pod=<podName>&uuid=<uuid>&action=remove"
서버를 삭제합니다.
curl http://<management-ip>:8080/v1/servers/<uuid> -X DELETE
조직의 다른 환경에서도 동일한 문제가 발생한다면 3단계를 반복합니다.
시나리오 2: 메시지 프로세서에 연결할 수 없음
- 관리 서버 로그의 오류 메시지에서 관찰된 UUID를 기반으로 IP 주소/호스트 이름을 확인하여 각 메시지 프로세서에 로그인합니다.
메시지 프로세서를 다시 시작합니다.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
트레이스 세션을 만들 수 있는지 다시 확인합니다. 문제가 지속되면 진단 정보를 수집해야 함으로 이동합니다.
원인: 높은 리소스 사용률 문제
진단
각 메시지 프로세서에 로그인하여 CPU, 메모리 또는 부하와 같은 리소스의 사용률이 높은지 확인합니다. Unix 기반 운영체제에서
top
명령어를 사용하여 메시지 프로세서 프로세스의 리소스 사용률 정보를 가져올 수 있습니다.top
메시지 프로세서의 리소스 사용률이 높지 않은 경우 진단 정보를 수집해야 함으로 이동합니다.
메시지 프로세서의 CPU 또는 메모리 사용량이 많은 경우 메시지 프로세서가 관리 서버에 제때 응답하지 않는 것일 수 있습니다. 이로 인해 결국 트레이스 세션을 만들 수 없게 됩니다.
해상도
아래 명령어를 사용하여 메시지 프로세서를 다시 시작합니다. 이렇게 하면 CPU 및 메모리 사용량이 줄어듭니다.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
API 호출을 모니터링하고 문제가 여전히 존재하는지 확인합니다.
Apigee Edge 지원팀에 문의하여 스레드 덤프, 힙 덤프, 메시지 프로세서 로그 (
/opt/apigee/var/log/edge-message-processor/logs/system.log)
)를 제공하여 높은 CPU/메모리 사용량의 원인을 조사할 수 있도록 도와주세요.
원인: API 프록시가 하나 이상의 메시지 프로세서에 배포되지 않았습니다.
드물지만 API 프록시가 하나 이상의 메시지 프로세서에 배포되지 않을 수도 있습니다. 이 문제는 특정 API 프록시를 배포하는 동안 관리 서버에서 메시지 프로세서로 전송되는 이벤트 알림이 누락되었기 때문에 주로 발생합니다. 이 경우에도 Edge UI에서 트레이스 세션을 만들 수 없습니다.
진단
각 메시지 프로세서에 로그인하고 다음 명령어를 사용하여 API 프록시의 특정 버전이 배포되었는지 확인합니다.
curl -v localhost:8082/v1/runtime/organizations/<orgname>/environments/<envname>/apis/<apiname>/revisions
출력 예시:
위 명령어의 출력으로 버전 목록이 표시됩니다. 예를 들어 버전 12가 배포되면 다음과 같은 출력이 표시됩니다.
[ '12' ]
API 프록시의 특정 버전이 위의 1단계에서 언급한 명령어의 출력으로 표시되지 않는 경우 아래 해결에 설명된 대로 해당 메시지 프로세서를 다시 시작합니다.
모든 메시지 프로세서에 대해 1~2단계를 반복합니다.
API 프록시의 특정 버전이 모든 메시지 프로세서에 배포되는 경우에는 이것이 문제의 원인이 아닙니다. 필수 진단 정보 수집으로 이동합니다.
해상도
API 프록시의 특정 버전이 배포되지 않은 특정 메시지 프로세서를 다시 시작합니다.
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
원인: Edge UI 문제
진단
- Edge UI에서
/opt/apigee/var/log/edge-ui/application.log
및/opt/apigee/var/log/edge-ui/edge-ui.log
로그를 확인하고 오류가 있는지 확인합니다. - 추가 조사를 위해 Apigee Edge 지원팀에 문의하고 해당 파일을 공유하세요.
진단 정보를 수집해야 함
위의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집하세요. Apigee Edge 지원팀에 문의하여 공유하세요.
명령어의 출력은 다음과 같습니다.
curl -v <management-server-host>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/<revision-number>/debugsessions -u <user>
관리 서버 로그
/opt/apigee/var/log/edge-management-server/logs/system.log.
메시지 프로세서 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log.
관리 서버에서 메시지 프로세서로의 telnet/nc 명령 출력:
telnet <MessageProcessor_IP> 8082 nc -vz <MessageProcessor_IP> 8082
메시지 프로세서에서 아래 netstat 명령어의 출력:
netstat -an > netstat.txt
Edge UI에 문제가 있는 것으로 확인되면 Edge UI 로그
/opt/apigee/var/log/edge-ui/application.log
및/opt/apigee/var/log/edge-ui/edge-ui.log.
를 제공합니다.이 플레이북에서 시도한 섹션에 대한 세부정보 및 이 문제를 빠르게 해결하는 데 도움이 되는 다른 유용한 정보입니다.