.. _monitoring_stats: 10장. 모니터링 & 통계 ****************** 이 장에서는 모니터링과 통계에 대해 설명한다. 모니터링과 통계는 용도에 따라 서로 다르게 이해되는 경우가 많다. 하지만 서비스는 숫자로 이야기한다는 관점에서 둘은 같다. 여기서 가장 중요한 요소는 실시간성이다. 5분도 너무 길다. 실시간으로 서비스 상태변화를 볼 수 있어야 한다. 수 많은 정책이 적용과 동시에 효과를 내는지 즉시 알 수 있어야 한다. 모든 통계는 1초단위로 수집되며 최소 단위가 된다. 모든 통계는 가상호스트별로 따로 수집될 뿐만 아니라 실시간(1초), 5분 평균으로 제공된다. 고객이 통계를 보다 쉽게 분석, 가공할 수 있도록 JSON과 XML 포맷으로 제공한다. :: http://127.0.0.1:10040/monitoring/realtime?type=[JSON 또는 XML] http://127.0.0.1:10040/monitoring/realtime?type=[JSON 또는 XML]&vhost=[가상호스트이름] http://127.0.0.1:10040/monitoring/average?type=[JSON 또는 XML]&min[1 또는 5] http://127.0.0.1:10040/monitoring/average?type=[JSON 또는 XML]&min[1 또는 5]&vhost=[가상호스트이름] - ``realtime`` 1초 전 서비스 상태를 제공한다. - ``average`` 5분(기본) 단위 통계를 제공한다. ``min`` 값이 1일 경우 1분 통계를 제공한다. - ``vhost`` 특정 가상호스트의 통계만 추출한다. .. note:: ``v2.12.9`` 부터는 ``average`` 통계에 멀티 가상호스트를 지정할 수 있다. :: http://127.0.0.1:10040/monitoring/average?vhost=foo.com,bar.com .. toctree:: :maxdepth: 2 .. _monitoring_stats_conf: 수집범위 ==================================== 통계수집 범위를 설정한다. :: # server.xml - # vhosts.xml - 0 OFF OFF OFF OFF OFF OFF miss - `` (기본: 0)`` 디렉토리별로 통계를 수집한다. 0으로 설정된 경우 모든 통계를 루트(/) 디렉토리로 수집한다. 1로 설정하면 통계는 첫 번째 Depth 디렉토리별로 수집된다. .. note:: 값의 제한은 없지만 수 만개 이상의 디렉토리 통계를 수집할 경우 자칫 메모리 문제를 초래할 수 있다. - ```` 디렉토리별로 통계수집할 때 상위 디렉토리 통계 합산여부를 설정한다. ```` 이 0이라면 이 설정은 무시된다. - ``OFF (기본)`` 상위 디렉토리로 통계를 합산하지 않는다. - ``ON`` 상위 디렉토리로 통계를 합산한다. 예를 들어, ```` 이 2이고 모든 디렉토리에 동일하게 10만큼의 트래픽이 발생하고 있다고 가정한다. ```` 이 ``OFF`` 라면 좌측 그림처럼 트래픽이 발생하는 디렉토리별로 따로 통계가 수집된다. ``ON`` 이라면 우측 그림처럼 하위 디렉토리의 모든 통계가 부모 디렉토리로 누적된다. .. figure:: img/stats_dirdepth.jpg :align: center 상위 디렉토리 누적통계 예를 들어 /img 디렉토리는 하위 디렉토리의 트래픽과 자신의 트래픽을 더한 30을 통계 값으로 가지며 이 트래픽은 부모 디렉토리로 합산된다. - ```` - ``OFF (기본)`` HTTPS트래픽을 SSL통계로만 수집한다. - ``ON`` HTTPS트래픽을 SSL과 HTTP양쪽 통계에 같이 수집한다. 기본적으로 SSL레이어를 통과하면 별도의 SSL 통계로 수집한다. HTTPS의 경우 상위 프로토콜에서 HTTP로 처리되기 때문에 보다 세세한 통계수집이 가능하다. 하지만 SSL통계와 HTTP통계 양쪽에 중복 통계수집이 되므로 HTTP통계만을 신뢰할 것을 권장한다. - ```` Loopback 클라이언트와 STON구간의 트래픽을 통계로 집계한다. - ``OFF (기본)`` 집계하지 않는다. - ``ON`` 집계한다. - ```` STON구간과 Loopback 원본서버 구간의 트래픽을 통계로 집계한다. - ``OFF (기본)`` 집계하지 않는다. - ``ON`` 집계한다. - ```` 클라이언트에게 응답한 모든 응답코드별 개수를 제공한다. - ``OFF (기본)`` 제공하지 않는다. - ``ON`` 제공한다. - ```` 원본서버의 모든 응답코드별 개수를 제공한다. - ``OFF (기본)`` 제공하지 않는다. - ``ON`` 제공한다. - ```` 신규캐싱/갱신과정 중인 객체를 클라이언트가 요청할 때의 Cache 판정. 다시 말해 동일 객체를 요청한 2번째 클라이언트에 대한 판정 기준을 설정한다. - ``MISS (기본)`` 첫번째 원본요청을 발생시킨 클라이언트와 동일하게 ``MISS`` 계열로 판정한다. - ``HIT`` 원본요청을 발생시키지 않았기 때문에 ``TCP_RT_HIT`` 로 판정한다. .. _monitoring-stats-host: 호스트 종합통계 ==================================== 호스트 통계는 가장 상위 개념의 통계로 서비스하는 모든 가상호스트의 통계를 종합한다. 같은 통계를 JSON과 XML형식으로 제공한다. :: { "RequestHitRatio":6387, "ClientRes3xxCount" : 0, "TCP_MISS" : 0, "TCP_REFRESH_MISS" : 0, 0 "TCP_CLIENT_REFRESH_MISS" : 0, 0 "TCP_DENIED" : 0, 0 "TCP_ERROR" : 0 0 }, "FileSystem": ... { ... "RequestHitRatio":0, ... "ByteHitRatio":0, ... "Outbound":0, ... "Session":0 ... }, "System":{ ... }, "VirtualHost": [ ... ] "View": [ ... ] } } - ``Version`` STON 버전 - ``Name`` 호스트이름. 설정하지 않았다면 시스템 이름을 보여준다. - ``State`` 서비스 상태. (Healthy=정상 서비스, Inactive=라이센스 비활성화, Emergency) - ``Uptime (단위: 초)`` 서비스 실행시간 - ``OriginSession`` 원본세션 수 - ``OriginActiveSession`` 전송 중인 원본세션 수 - ``OriginInbound (단위: Bytes, 평균)`` 원본서버로부터 받은 양 - ``OriginReqCount (평균)`` 원본서버로 보낸 요청횟수 - ``OriginOutbound (단위: Bytes, 평균)`` 원본서버로 보낸 양 - ``OriginResTotalCount (평균)`` 원본서버 응답횟수 - ``OriginResTotalTimeRes (단위: 0.01ms, 평균)`` 원본서버 응답시간 (HTTP요청 전송 ~ HTTP응답 첫 수신) - ``OriginResTotalTimeComplete (단위: 0.01ms, 평균)`` 원본서버 HTTP 트랜잭션 완료시간 (HTTP요청 전송 ~ HTTP응답 완료) - ``OriginRes2xxCount (평균)`` 원본서버 2xx응답횟수 - ``OriginRes2xxTimeRes (단위: 0.01ms, 평균)`` 원본서버 2xx응답시간 - ``OriginRes2xxTimeComplete (단위: 0.01ms, 평균)`` 원본서버 2xx 트랜잭션 완료시간 - ``OriginRes3xxCount (평균)`` 원본서버 3xx응답횟수 - ``OriginRes3xxTimeRes (단위: 0.01ms, 평균)`` 원본서버 3xx응답시간 - ``OriginRes3xxTimeComplete (단위: 0.01ms, 평균)`` 원본서버 3xx 트랜잭션 완료시간 - ``OriginRes4xxCount (평균)`` 원본서버 4xx응답횟수 - ``OriginRes4xxTimeRes (단위: 0.01ms, 평균)`` 원본서버 4xx응답시간 - ``OriginRes4xxTimeComplete (단위: 0.01ms, 평균)`` 원본서버 4xx 트랜잭션 완료시간 - ``OriginRes5xxCount (평균)`` 원본서버 5xx응답횟수 - ``OriginRes5xxTimeRes (단위: 0.01ms, 평균)`` 원본서버 5xx응답시간 - ``OriginRes5xxTimeComplete (단위: 0.01ms, 평균)`` 원본서버 5xx 트랜잭션 완료시간 - ``ClientSession`` 클라이언트 세션 수 - ``ClientActiveSession`` 전송 중인 클라이언트 세션 수 - ``ClientInbound (단위: Bytes, 평균)`` 클라이언트로부터 받은 양 - ``ClientOutbound (단위: Bytes, 평균)`` 클라이언트에게 보낸 양 - ``ClientReqCount (평균)`` 클라이언트가 보낸 요청횟수 - ``ClientResTotalCount (평균)`` 클라이언트 응답횟수 - ``ClientResTotalTimeRes (단위: 0.01ms, 평균)`` 클라이언트 응답시간 (HTTP요청 수신 ~ HTTP응답 전송) - ``ClientResTotalTimeComplete (단위: 0.01ms, 평균)`` 클라이언트 HTTP 트랜잭션 완료시간 (HTTP요청 수신 ~ HTTP응답 완료) - ``ClientRes2xxCount (평균)`` 클라이언트 2xx응답횟수 - ``ClientRes2xxTimeRes (단위: 0.01ms, 평균)`` 클라이언트 2xx응답시간 - ``ClientRes2xxTimeComplete (단위: 0.01ms, 평균)`` 클라이언트 2xx 트랜잭션 완료시간 - ``ClientRes3xxCount (평균)`` 클라이언트 3xx응답횟수 - ``ClientRes3xxTimeRes (단위: 0.01ms, 평균)`` 클라이언트 3xx응답시간 - ``ClientRes3xxTimeComplete (단위: 0.01ms, 평균)`` 클라이언트 3xx 트랜잭션 완료시간 - ``ClientRes4xxCount (평균)`` 클라이언트 4xx응답횟수 - ``ClientRes4xxTimeRes (단위: 0.01ms, 평균)`` 클라이언트 4xx응답시간 - ``ClientRes4xxTimeComplete (단위: 0.01ms, 평균)`` 클라이언트 4xx 트랜잭션 완료시간 - ``ClientRes5xxCount (평균)`` 클라이언트 5xx응답횟수 - ``ClientRes5xxTimeRes (단위: 0.01ms, 평균)`` 클라이언트 5xx응답시간 - ``ClientRes5xxTimeComplete (단위: 0.01ms, 평균)`` 클라이언트 5xx 트랜잭션 완료시간 - ``RequestHitRatio (단위: 0.01%, 평균)`` Hit율. 캐싱객체가 생성되어 있고 해당 객체가 초기화되어 있다면 Hit이다. 반대로 캐싱객체가 없거나 해당 객체가 원본서버로부터 초기화되지 않았다면 Hit로 치지 않는다. 응답코드와 Hit율은 관련이 없다. .. figure:: img/stat_filesystem1.png :align: center HTTP와 File I/O는 가상호스트를 공유한다. Apache를 통해 접근되는 File I/O의 RequestHitRatio는 0%이 된다. 하지만 HTTP Server의 경우 File I/O에 의해 캐싱된 파일이 서비스되기 때문에 100%의 RequestHitRatio를 가진다. ByteHitRatio의 경우 원본 Inbound대비 Http outbound, File I/O outbound로 각각 계산된다. - ``ByteHitRatio (단위: 0.01%, 평균)`` 원본서버 대비 클라이언트 전송률. :: (클라이언트 Outbound - 원본서버 Inbound) / 클라이언트 Outbound 원본서버가 훨씬 빠른 속도를 가지고 있거나 클라이언트 세션이 금방 끊어진다면 음수가 된다. - ``FileSystem`` 독립적인 FileSystem 통계로 다른 통계 수치에 취합되지 않는다. - ``RequestHitRatio (단위: 0.01%, 평균)`` File I/O를 통한 Hit율 - ``ByteHitRatio (단위: 0.01%, 평균)`` 원본서버 대비 File I/O 전송률 - ``Outbound (단위: Bytes, 평균)`` File I/O로 서비스한 데이터 크기 - ``Session (평균)`` File I/O 진행 중인 Thread 수 .. note:: 5분 통계에서만 제공되는 항목. - ``HttpCountSum`` HTTP 트랜잭션의 총 개수 - ``HttpRequestHitSum`` 캐시 HIT 결과 System 통계 ==================================== 시스템 및 전역자원 통계를 JSON과 XML형식으로 제공한다. :: "System": { "SoftIRQ":12, { }, "Contents": { "Limit": 1024, "Status":"Normal", "Path":"/cache2", "Status":"Normal", "Write":24, "IOTime":189, { 0 "Total":42, 1000000 "Established":1, 0 "Accepted":0, "Closed":0 }, 57 "ClientSocket": 1979927 { "Total":1, "Established":0, "Connected":0, "Closed":0 }, "TCPSocket": { "Established":30, "Timewait":2, "Orphan":0, "Alloc":0, "Mem":20 }, "EQ":0, "RQ":1000000, "WaitingFiles2Write":0, "ServiceAccess":{"Allow":60, "Deny":2} "SystemLoadAverage": { "Min1":0, "Min5":0, "Min15":0 }, "URLRewrite":57, "MaxFileCount": 10000 } - ``CPU (단위: 0.01%)`` CPU사용량. 전체 CPU사용량은 Kernel + User로 계산해야 한다. - ``Kernel`` CPU(Kernel) 사용량 - ``User`` CPU(User) 사용량 - ``Idle`` 사용되지 않는 CPU량 - ``ProcKernel`` STON이 사용하는 CPU(Kernel) 사용량 - ``ProcUser`` STON이 사용하는 CPU(User) 사용량 - ``Nice`` niced processes executing in user mode - ``IOWait`` waiting for I/O to complete - ``IRQ`` servicing interrupts - ``SoftIRQ`` servicing softirqs - ``Steal`` involuntary wait - ``Mem (단위: Bytes)`` 메모리 사용량 - ``Total`` 시스템 물리 메모리 크기 - ``Free`` 시스템 Free 메모리 크기 - ``STON`` STON이 사용하는 메모리 크기 - ``ProcessMemory`` 프로세스 메모리 정보 - ``Peak`` STON Peak 메모리 크기 - ``Size`` STON 가용 메모리 크기 - ``Rss`` STON RSS 메모리 크기 - ``Contents`` 콘텐츠 정보 - ``Limit`` 임계 콘텐츠 메모리 크기 - ``Using`` 사용 중인 콘텐츠 메모리 크기 - ``OverUsing`` 초과 사용 중인 콘텐츠 메모리 크기 - ``SecureRatio`` 콘텐츠 메모리 정리 비율 - ``SecureSize`` 콘텐츠 메모리 정리 용량 - ``Disk`` 디스크 성능지표 - ``Path`` 디스크 경로 - ``Status`` 디스크 상태 (Normal: 정상동작, Invalid: 장애로 배제됨, Unmounted: 관리자에 의해 Unmount됨) - ``Read`` 읽기 성공 횟수 - ``ReadMerged`` 읽기가 병합된 횟수 - ``ReadSectors`` 읽은 섹터 수 - ``ReadTime (단위: ms)`` 읽기 소요시간 - ``Write`` 쓰기 성공 횟수 - ``WriteMerged`` 쓰기가 병합된 횟수 - ``WriteSectors`` 써진 섹터 수 - ``WriteTime (단위: ms)`` 쓰기 소요시간 - ``IOProgress`` 진행 중인 IO개수 - ``IOTime (단위: ms)`` IO 소요시간 - ``IOWeightedTime (단위: ms)`` IO 소요시간(가중치 적용) - ``ServerSocket`` 서버 소켓(클라이언트와 STON 구간) 정보 - ``Total`` 전체 서버소켓 수 - ``Established`` 연결된 상태의 서버소켓 수 - ``Accepted`` 새롭게 연결된 서버소켓 수 - ``Closed`` 연결이 종료된 서버소켓 수 - ``ClientSocket`` 클라이언트 소켓(STON과 원본서버 구간) 정보 - ``Total`` 전체 클라이언트소켓 수 - ``Established`` 연결된 상태의 클라이언트소켓 수 - ``Connected`` 새롭게 연결된 클라이언트소켓 수 - ``Closed`` 연결이 종료된 클라이언트소켓 수 - ``TCPSocket`` 시스템(OS)이 제공하는 TCP상태 정보 - ``Established`` Established상태의 TCP 연결개수 - ``Timewait`` TIME_WAIT 상태의 TCP 연결개수 - ``Orphan`` 아직 file handle에 attach되지 않은 TCP 연결 - ``Alloc`` 할당된 TCP 연결 - ``Mem`` (undocumented) - ``EQ`` STON Framework에서 아직 처리되지 않은 Event개수 - ``RQ`` 최근 서비스된 컨텐츠 참조 큐에 저장된 Event 개수 - ``WaitingFiles2Write`` 디스크에 쓰기 대기중인 파일개수 - ``ServiceAccess`` ServiceAccess에 의해 허가(Allow), 거부(Deny)된 소켓 수 - ``SystemLoadAverage`` System Load Average의 1분/5분/15분 평균 - ``URLRewrite`` URL전처리에 의해 변환이 성공한 횟수 - ``MaxFileCount`` 캐싱 최대 인덱싱 개수 .. _monitoring-stats-vhost: 가상호스트 통계 ==================================== 가상호스트별로 통계가 제공된다. 가상호스트 통계는 HTTP전송(디렉토리 별), URL바이패스, 포트바이패스, SSL로 구분된다. :: "VirtualHost": "RequestHitRatio":10000, "ByteHitRatio":9984, 0 "FileSystem": 0 { 0 "RequestHitRatio":0, 0 "ByteHitRatio":0, "Outbound":0, 784786700. "Session":0 0. }, ... "Memory":785740769, ... "SecuredMemory":0, ... "Disk": { ... }, ... "Session": { ... }, "Dims": { ... }, ... "Compression": { ... }, ... "FileTotal":458308, 1087593 "FileOpened":15, "FileInstance":458320, 27 "Cached": { ... }, 1 "CacheFileEvent": { ... }, ... "WaitingFiles2Delete":1087595, ... "ClientHttpReqBypassSum":8100, ... "ClientHttpReqBypass":27, ... "ClientHttpReqDeniedSum":400, "ClientHttpReqDenied":1, ... "OriginTraffic": { ... }, ... "PortBypass": { ... }, ... "ClientTraffic": { ... }, "UrlBypass": { ... } }, ... ] .. note: ※ Name부터 FileSystem까지 호스트 통계와 동일하다. - ``Memory (단위: Bytes)`` 메모리에 적재된 컨텐츠 양 - ``SecuredMemory (단위: Bytes)`` 메모리에서 삭제한 컨텐츠 양 - ``Disk`` 디스크 정보 - ``Session`` 세션 정보 - ``Dims`` DIMS변환 통계 - ``Compression`` 압축 통계 - ``FileTotal`` 전체파일 개수 - ``FileOpened`` 열려져 있는 로컬파일 개수 - ``FileInstance`` 캐싱파일 개수 - ``Cached`` 캐싱 정보 - ``CacheFileEvent`` 캐싱파일 이벤트 - ``WaitingFiles2Delete`` 삭제대기 중인 파일개수 - ``ClientHttpReqBypass`` 바이패스한 클라이언트 HTTP요청 횟수 - ``ClientHttpReqDenied`` HTTP요청이 차단된 횟수 - ``OriginTraffic`` 원본서버 트래픽 통계 - ``PortBypass`` 포트 바이패스 트래픽 통계 - ``ClientTraffic`` 클라이언트 트래픽 통계 - ``UrlBypass`` URL매칭 또는 ```` 를 통해 원본서버로변환 통계되는 HTTP트래픽 통계 .. note:: 5분 통계에서만 제공되는 항목. - ``ClientHttpReqBypassSum`` 바이패스되는 HTTP요청의 총 개수 - ``ClientHttpReqDeniedSum`` Deny되는 HTTP요청의 총 개수 디스크 통계 ------------------------------ 가상호스트가 사용하는 디스크통계를 제공한다. :: "Disk": { 22003701435 "TotalSize":22004057982, 1 "Create":0, 10 "Open":1, 0 "Delete":0, 9 "ReadCount":1, 735726 "ReadSize":104744, 1 "WriteCount":0, 157145 "WriteSize":0, "U16G":0, "O16G":0 } } - ``TotalSize (단위: Bytes)`` 로컬파일 크기 합 - ``Create`` 로컬파일 생성 횟수 - ``Open`` 로컬파일 Open 횟수 - ``Delete`` 로컬파일 삭제 횟수 - ``ReadCount`` 로컬파일에서 Read한 횟수 - ``ReadSize (단위: Bytes)`` 로컬파일에서 Read한 크기 - ``WriteCount`` 로컬파일에서 Write한 횟수 - ``WriteSize (단위: Bytes)`` 로컬파일에서 Write한 크기 - ``Distribution`` 로컬파일 크기별 분포 - ``U1K`` 1KB 미만 파일 개수 - ``U2K`` 2KB 미만 파일 개수 - ``U4K`` 4KB 미만 파일 개수 - ``U8K`` 8KB 미만 파일 개수 - ``U16K`` 16KB 미만 파일 개수 - ``U32K`` 32KB 미만 파일 개수 - ``U64K`` 64KB 미만 파일 개수 - ``U128K`` 128KB 미만 파일 개수 - ``U256K`` 256KB 미만 파일 개수 - ``U512K`` 512KB 미만 파일 개수 - ``U1M`` 1MB 미만 파일 개수 - ``U2M`` 2MB 미만 파일 개수 - ``U4M`` 4MB 미만 파일 개수 - ``U8M`` 8MB 미만 파일 개수 - ``U16M`` 16MB 미만 파일 개수 - ``U32M`` 32MB 미만 파일 개수 - ``U64M`` 64MB 미만 파일 개수 - ``U128M`` 128MB 미만 파일 개수 - ``U256M`` 256MB 미만 파일 개수 - ``U512M`` 512MB 미만 파일 개수 - ``U1G`` 1GB 미만 파일 개수 - ``U2G`` 2GB 미만 파일 개수 - ``U4G`` 4GB 미만 파일 개수 - ``U8G`` 8GB 미만 파일 개수 - ``U16G`` 16GB 미만 파일 개수 - ``O16G`` 16GB 이상 파일 개수 세션 통계 ------------------------------ 가상호스트가 사용하는 TCP 세션통계를 제공한다. :: "Session": "ActiveOrigin":7 }, - ``Client`` 전체 HTTP 클라이언트 세션수 - ``ActiveClient`` 전체 HTTP 클라이언트 중 전송 중인 세션수 - ``Origin`` 전체 원본서버 세션수 - ``ActiveOrigin`` 전송 중인 원본서버 세션수 DIMS 통계 ------------------------------ DIMS의 성능지표를 제공한다. :: "Dims": "AvgTime": 34 }, - ``Requests`` 변환요청 횟수 - ``Converted`` 변환성공 횟수 - ``Failed`` 변환실패 횟수 - ``NotModified`` 미변환 횟수 (원본이미지 미변경) - ``AvgSrcSize (단위: Bytes)`` 원본 이미지의 평균 크기 - ``AvgDestSize (단위: Bytes)`` 변환된 이미지의 평균 크기 - ``AvgTime (단위: ms)`` 변환 소요시간 압축 통계 ------------------------------ 압축의 성능지표를 제공한다. :: "Compression": "AvgTime": 34 }, - ``Requests`` 압축요청 횟수 - ``Converted`` 압축성공 횟수 - ``Failed`` 압축실패 횟수 - ``AvgSrcSize (단위: Bytes)`` 원본 파일의 평균 크기 - ``AvgDestSize (단위: Bytes)`` 압축된 파일의 평균 크기 - ``AvgTime (단위: ms)`` 압축 소요시간 .. _monitoring_stats_vhost_origin: 원본 통계 ------------------------------ STON과 원본서버 사이에 발생하는 트래픽통계를 제공한다. .. note:: :ref:`origin_dynamic` 기능이 활성화될 경우 ``OriginTraffic`` 에 ``Name`` 속성이 추가되며 멀티로 구성된다. ``JSON`` 포맷인 경우 아래와 같이 배열로 구성된다. :: "OriginTraffic" : [ { ... }, { ... } ] :: "OriginTraffic": { 2 "HttpReqCountSum":0, 3238 "HttpReqCount":0, 0 "HttpReqHeaderSize":269, 2020 "HttpReqBodySize":0, 104894 "HttpResHeaderSize":169, "HttpResBodySize":0, "Response": 13 { 12 "ResTotal": 1553 { 6630 "CountSum":0, "Count":1, "CompletedSum":0, 1 "Completed":1, 1 "TimeRes":3300, 3300 "TimeComplete":3300 69300 }, "Res2xx": { 12 "CountSum":0, 11 "Count":0, 1408 "CompletedSum":0, 1408 "Completed":0, "TimeRes":0, "TimeComplete":0 0 }, 0 "Res3xx": 0 { 0 "CountSum":0, "Count":1, "CompletedSum":0, 0 "Completed":1, 0 "TimeRes":3300, 0 "TimeComplete":3300 0 }, "Res4xx": 0 { 0 "CountSum":0, 0 "Count":0, "CompletedSum":0, "Completed":0, 0 "TimeRes":0, 0 "TimeComplete":0 0 }, "Res5xx": { "CountSum":0, "Count":0, "CompletedSum":0, "Completed":0, "TimeRes":0, "TimeComplete":0 }, "ConnectTimeoutSum":0, "ConnectTimeout":0, "ReceiveTimeoutSum":0, "ReceiveTimeout":0, "CloseSum":0, "Close":0 }, "Connect": { "Count":0, "AvgDNSQueryTime":0, "AvgConnTime":0 } }, - ``HttpReqCount`` 원본서버로 보낸 HTTP 요청 횟수 - ``HttpReqHeaderSize (단위: Bytes)`` 원본서버로 보낸 HTTP 헤더 크기 - ``HttpReqBodySize (단위: Bytes)`` 원본서버로 보낸 HTTP Body 크기 - ``HttpResHeaderSize (단위: Bytes)`` 원본서버에서 받은 HTTP 헤더 크기 - ``HttpResBodySize (단위: Bytes)`` 원본서버에서 받은 HTTP Body 크기 - ``Response`` 원본서버에서 보낸 응답 (ResXXX) - ``Count`` 응답횟수 - ``Completed`` 정상적으로 전송완료된 HTTP트랜잭션 횟수 - ``TimeRes`` HTTP 응답시간 - ``TimeComplete`` HTTP 트랜잭션 완료시간 - ``Response`` 기타 필드 - ``ConnectTimeout`` 연결실패 - ``ReceiveTimeout`` 전송지연 - ``Close`` 전송 중 원본서버에서 먼저 소켓 종료 - ``Connect`` 원본서버 접속통계 - ``Count`` 접속횟수 - ``AvgDNSQueryTime (단위: 0.01ms)`` 평균 DNS쿼리 시간 - ``AvgConnTime (단위: 0.01ms)`` 평균 접속시간 (TCP SYN전송 ~ TCP SYN ACK수신) ``v2.9.8`` 부터는 ```` 설정이 활성화되어 있다면 다음과 같이 상세 코드별 개수를 제공한다. :: # xml # json "Response": { "Codes": { "_0": 0, "_100": 0, "_200": 435, ... } } .. note:: 5분 통계에서만 제공되는 항목. - ``HttpReqCountSum`` HTTP요청의 총 회수 - ``CountSum`` HTTP응답의 총 회수 - ``CompletedSum`` 완료된 HTTP 트랜잭션의 총 회수 - ``ConnectTimeoutSum`` 원본서버 접속실패 총 회수 - ``ReceiveTimeoutSum`` 원본서버 전송지연 총 회수 - ``CloseSum`` 원본서버에서 먼저 연결을 종료한 총 회수 포트바이패스 통계 ------------------------------ ```` 를 통해 발생한 트래픽통계를 제공한다. :: "PortBypass": [ 0 { "Established":0, "ClientClosed":0, "OriginClosed":0, "OriginCT":0 }, "ClientTraffic": { "In":0, "Out":0 }, "OriginTraffic": { "In":0, "Out":0 } 17 }, ... { "SrcPort":1936, "DestPort":1936, "Session":17, ... } ], - ``SrcPort/DestPort`` 바이패스 하는 STON포트/원본서버 포트 - ``Session`` 현재 연결된 세션 수 - ``Hit`` 바이패스 접속 통계 - ``Established`` 성립된 연결 개수 - ``ClientClosed`` 클라이언트가 연결 종료한 횟수 - ``OriginClosed`` 원본서버에서 연결 종료한 횟수 - ``OriginCT`` 원본서버 접속실패 횟수 - ``ClientTraffic (단위: Bytes)`` 클라이언트 트래픽 (In=Inbound, Out=Outbound) - ``OriginTraffic (단위: Bytes)`` 원본서버 트래픽 (In=Inbound, Out=Outbound) .. _monitoring_stats_vhost_client: 클라이언트 통계 ------------------------------ 클라이언트 트래픽은 디렉토리별 통계설정 여부에 의해 "Traffic"이 멀티로 표현된다. 디렉토리별 통계를 설정하지 않았다면 모든 트래픽은 루트(/)로 집계된다. 디렉토리 통계가 설정되어 있다면 루트(/)와 트래픽이 발생한 디렉토리만 제공된다. :: "ClientTraffic": { 1 "Depth":0, "Accum":"OFF", / "HttpsTraffic":"OFF", 0 "TrafficCount":1, 4113 "Traffic": 0 [ 3066 { 892871 "RequestHitRatio" : 9984, "Path":"/", "HttpReqCountSum":0, 18 "HttpReqCount":100, 18 "HttpReqHeaderSize":13968, 666 "HttpReqBodySize":0, 4377 "HttpResHeaderSize":5654, "HttpResBodySize":104744, "Response": 10 { 10 "ResTotal": 1200 { 7870 "CountSum":0, "Count":52, "CompletedSum":0, 8 "Completed":52, 8 "TimeRes":94, 0 "TimeComplete":107 12 }, "Res2xx": { 0 "CountSum":0, 0 "Count":1, 0 "CompletedSum":0, 0 "Completed":1, "TimeRes":4700, "TimeComplete":4800 0 }, 0 "Res3xx": 0 { 0 "CountSum":0, "Count":51, "CompletedSum":0, "Completed":51, "Res5xx": "SendSize":0 }, "RequestHit": 0 "TCP_REFRESH_HIT":0, 0 "TCP_REF_FAIL_HIT":0, 0 "TCP_REFRESH_MISS":0, "TCP_REDIRECT_HIT":0, "DirCount" : 0, "FailCount" : 0, "TotalCount" : 0 }, "Open" : { "TimeRes" : 0, "Count" : 0 }, "Read" : { "TimeRes" : 0, "BufferSize" : 0, "BufferFilled" : 0, "Count" : 0 }, "RequestHit": { "TCP_NONE":0, "TCP_HIT":0, "TCP_IMS_HIT":0, "TCP_REFRESH_HIT":0, "TCP_REF_FAIL_HIT":0, "TCP_NEGATIVE_HIT":0, "TCP_REDIRECT_HIT":0, "TCP_MISS":0, "TCP_REFRESH_MISS":0, "TCP_CLIENT_REFRESH_MISS":0, "TCP_DENIED":0, "TCP_ERROR":0 }, "RequestHitSum": { "TCP_NONE":0, "TCP_HIT":0, "TCP_IMS_HIT":0, "TCP_REFRESH_HIT":0, "TCP_REF_FAIL_HIT":0, "TCP_NEGATIVE_HIT":0, "TCP_REDIRECT_HIT":0, "TCP_MISS":0, "TCP_REFRESH_MISS":0, "TCP_CLIENT_REFRESH_MISS":0, "TCP_DENIED":0, "TCP_ERROR":0 } } } ] } - ``Depth`` 통계를 수집할 디렉토리 Depth - ``Accum`` 디렉토리 통계가 설정된 경우 하위 디렉토리의 통계를 상위 디렉토리로 누적시키는 설정 - ``HttpsTraffic`` HTTPS트래픽을 HTTP트래픽으로 중복하여 집계하는 설정 - ``TrafficCount`` 집계된 트래픽 카운트 - ``Traffic`` 디렉토리별 통계. 루트(/)는 항상 존재한다. - ``Path`` 서비스 디렉토리 - ``HttpReqCount(단위: Bytes)`` 클라이언트가 보낸 HTTP 요청 개수 - ``HttpReqHeaderSize(단위: Bytes)`` 클라이언트가 보낸 HTTP 요청 헤더 크기 - ``HttpReqBodySize(단위: Bytes)`` 클라이언트가 보낸 HTTP 요청 Body 크기 - ``HttpResHeaderSize(단위: Bytes)`` STON이 보낸 HTTP 응답 헤더 크기 - ``HttpResBodySize(단위: Bytes)`` STON이 보낸 HTTP 응답 Body 크기 - ``Response`` STON이 보낸 응답 - ``Count`` 응답횟수 - ``Completed`` 정상적으로 전송완료된 HTTP트랜잭션 횟수 - ``TimeRes`` HTTP 응답시간 - ``TimeComplete`` HTTP 트랜잭션 완료시간 - ``SSL(단위: Bytes)`` HTTPS 트래픽 (RecvSize=수신크기, SendSize=송신크기) - ``RequestHit`` 캐싱 HIT결과 - ``FileSystem`` FileSystem 접근 - ``GetAttr`` getattr함수 호출회수와 응답시간. (FileCount: File응답, DirCount: Dir응답, FailCount: 실패응답) - ``Open`` open함수 호출회수와 응답시간 - ``Read`` read함수 호출회수와 응답시간, 요청크기(BufferSize)와 응답크기(BufferFilled) - ``RequestHit`` (File I/O 접근) 캐싱 HIT결과 ``v2.9.8`` 부터는 ```` 설정이 활성화되어 있다면 다음과 같이 상세 코드별 개수를 제공한다. :: # xml # json "Response": { "Codes": { "_0": 0, "_100": 0, "_200": 435, ... } } .. note:: 5분 통계에서만 제공되는 항목. - ``HttpReqCountSum`` HTTP요청의 총 회수 - ``CountSum`` HTTP응답의 총 회수 - ``CompletedSum`` 완료된 HTTP 트랜잭션의 총 회수 - ``RequestHitSum`` 캐시 HIT 결과 View ==================================== View는 가상호스트들을 하나로 묶어 통계를 추출하는 방식이다. Database에서 여러 Table을 마치 하나인 것처럼 다루는 View에서 따온 개념이다. 구성은 다음과 같이 아주 간단하다. :: # vhosts.xml ... ... ... (생략) ... ... ... ... ... ... ... ... 존재하지 않는 가상호스트로 View를 구성해도 상관없다. View가 제공하는 통계는 다음과 같다. :: - Realtime XML/JSON - SNMP - cache(1.3.6.1.4.1.40001.1.4).10 ~ 12 이해를 돕기 위해 View가 필요한 예를 들어보자. 류헌진, 서장혼, 박지송은 각각 자신이 좋아하는 스포츠 커뮤니티 사이트를 운영하고 있다. :: # vhosts.xml ... ... ... 평소 친분이 있던 셋은 의기투합하여 스포츠 종합 커뮤니티 서비스를 오픈하기로 결정했다. 도메인도 서비스를 모두 아우를 수 있는 sports.com으로 정했다. 개발/운영팀이 해결해야하는 미션은 다음과 같다. - 통합 서비스는 sports.com으로 한다. - 기존 사용자를 위해 기존 도메인과 서비스는 그대로 유지한다. - 개발팀은 통합한다. 운영팀은 통합한다. - 대문(첫 페이지)만 신규 개발한다. 링크를 통해 기존 서비스를 이용한다. - 예산이 없다. 사람이 없다. 시간이 없다. 정신이 없다. - 이미 모든 구매절차가 끝났다. 이 모든 요구사항을 처리하는 현실적인 방법으로 개발팀은 다음과 같이 1번째 디렉토리에 기존 도메인을 명시하는 규칙을 사용하기로 결정했다. :: # 기존 서비스 http://baseball.com/standing/list.html http://basketball.com/stats/2014/view.html http://football.com/player/messi.php # 통합 서비스 http://sports.com/baseball/standing/list.html http://sports.com/basketball/stats/2014/view.html http://sports.com/football/player/messi.php URL 전처리를 사용하면 간단히 설정할 수 있다. :: # vhosts.xml ... ... ... sports.com/(.*)/(.*) #1.com/#2 통합된 운영팀에서는 이제 각각의 서비스 뿐만 아니라 통합된 서비스(트래픽, 세션, 응답코드 등)에 대해서도 모니터링해야 한다. 대부분 SNMP에 익숙한 관리자들이며 통합된 지표를 얻기 위해 다음과 같이 View를 구성한다. .. figure:: img/view1.png :align: center :: # vhosts.xml ... ... ... sports.com/(.*)/(.*) #1.com/#2 baseball.com basketball.com football.com 이상의 예에서 알 수 있듯이 URL Rewrite와 View의 조합은 기존 사이트를 하나로 묶어 서비스할 때 효과적이다. View 통계 ---------------------------- 가상호스트와 동일한 통계를 제공한다. 다음과 같이 태그 이름만 다르다. :: "View": [ ... { ... }, { ... }, ... ] ... .. _api-monitoring-vhostlist: 가상호스트 목록조회 ==================================== 가상호스트 목록을 조회한다. :: http://127.0.0.1:10040/monitoring/vhostslist 결과는 JSON형식으로 제공된다. :: { "version": "2.0.0", "method": "vhostslist", "status": "OK", "result": [ "www.example.com","www.winesoft.com", "site1.com" ] } .. _api-monitoring-fileinfo: 캐싱정보 ==================================== 캐싱하고 있는 파일상태를 모니터링한다. 일반적으로 파일은 URL로 구분되지만 같은 URL에 다른 옵션(i.e. Accept-Encoding등)이 존재하는 경우 여러 개의 파일이 존재할 수 있다. :: http://127.0.0.1:10040/monitoring/fileinfo?url=example.com/sample.dat 결과는 JSON형식으로 제공된다. 다음은 /sample.dat파일의 정보를 열람한 결과이다. :: { "version": "2.0.0", "method": "fileinfo", "status": "OK", "result": [ { "URI": "/sample.dat", "Accept-Encoding": "N", "RefCount": 0, "Disk-Index": 0, "Size": 2100267, "FID": 24267, "LocalPath": "/cache1/example.com/000i/q3.bin", "File-Opened ": "N", "File-Updating": "-", "Downloader-Count": "0", "LastAccess": "[ 2012.09.03 14:29:50, -2 ]", "UpdateTime": "[ 2012.09.03 13:53:43, -2169 ]", "TTL-Left": "[ 2012.10.03 13:53:43, 2589831 ]", "ResponseCode": 200, "ContentType": "text/plain", "LastModifiedTime": "[ 2010.11.22 20:31:47, -56224685 ]", "ExpireTime": "[ 0, 0 ]", "CacheControl": "not-specified", "ETag": "502dd614:200c2b", "CustomTTL": 0, "NoMoreExist": "N", "LocalFileExist": "Y", "SmallFile": "N", "State": "Cached", "Deleted": "N", "AddedSize": "Y", "TransferEncoding": "N", "Compression": "-", "Purge": "N", "Ignore-IMS ": "N", "Redirect-Location ": "-", "Content-Disposition ": "-", "NoCache": "N" } ] } - ``URI`` 파일 URI - ``Accept-Encoding`` ("Y" or "N") Accept-Encoding을 지원한다면 "Y" - ``RefCount`` 파일참조 카운트 - ``Size`` (Bytes) 파일크기 - ``Disk-Index`` (0부터 시작) 저장된 디스크 인덱스 - ``FID`` 파일 ID - ``LocalPath`` 로컬 경로 - ``File-Opened`` ("Y" or "N") 로컬파일을 열고 있다면 "Y" - ``File-Updating`` 파일을 갱신 중이라면 갱신하는 객체의 포인터가 명시 - ``Downloader-Count`` 원본서버에서 이 파일을 다운로드 받는 현재 세션의 개수 - ``LastAccess`` (마지막 접근시간, 마지막 접근시간-현재시간) [ 2012.09.03 14:29:50, -2 ]의 의미는 2012.09.03 14:29:50에 접근됐으며 현재로부터 2초 전에 접근됐다는 의미이다. - ``UpdateTime`` (갱신시간, 갱신시간-현재시간) 파일이 마지막으로 갱신된 시간. 304 Not Modified에도 시간은 갱신된다. - ``TTL-Left`` (만료시간, 만료시간-현재시간) 컨텐츠 만료 예정시간. TTL이 남았다면 양수로, 만료됐다면 음수로 표기된다. - ``ResponseCode`` 원본서버 응답코드 - ``ContentType`` MIME Type - ``LastModifiedTime`` 원본서버가 보낸 Last Modified Time. 원본서버가 이 값을 보내지 않았다면 0으로 표시된다. - ``ExpireTime`` 원본서버가 보낸 Expire Time. 원본서버가 이 값을 보내지 않았다면 0으로 표시된다. - ``CacheControl`` ("no-cache" or "not-specified" or (정수)) 원본서버가 보낸 Cache-Contorl 값 - ``ETag`` STON이 생성한 ETag - ``CustomTTL`` 커스텀 TTL. 설정되어 있지 않다면 0이다. - ``NoMoreExist`` ("Y" or "N") 파일을 파기예약되어 있다면 "Y" - ``LocalFileExist`` ("Y" or "N") 로컬에 파일이 존재하면 "Y" (200 OK가 아닌 파일들은 항상 "Y") - ``SmallFile`` ("Y" or "N") 파일을 작은파일로 판단한다면 "Y" (개발적인 이유) - ``State`` ("Not Init" or "Cached" or "Error") 파일 상태 - ``Deleted`` ("Y" or "N") 삭제되었다면 "Y" (개발적인 이유) - ``AddedSize`` ("Y" or "N") 크기가 통계에 반영되었다면 "Y" (개발적인 이유) - ``TransferEncoding`` ("Y" or "N") Transfer-Encoding을 지원한다면 "Y" - ``Compression`` 압축방식 - ``Purge`` ("Y" or "N") Purge됐다면 "Y" - ``Ignore-IMS`` ("Y" or "N") 갱신할 때 If-Modified-Since헤더를 보내지 않도록 설정되었다면 "Y" - ``Redirect-Location`` Location 헤더 값 - ``Content-Disposition`` Content-Disposition 헤더 값 - ``NoCache`` ("Y" or "N") 원본서버에서 no-cache응답을 줬다면 "Y" .. _api-monitoring-logtrace: Log Trace ==================================== 기록되는 로그를 실시간으로 받아본다. Access, Origin, Monitoring로그는 가상호스트(vhost)를 지정해야 한다. :: http://127.0.0.1:10040/monitoring/logtrace/info http://127.0.0.1:10040/monitoring/logtrace/deny http://127.0.0.1:10040/monitoring/logtrace/sys http://127.0.0.1:10040/monitoring/logtrace/originerror http://127.0.0.1:10040/monitoring/logtrace/access?vhost=www.site1.com http://127.0.0.1:10040/monitoring/logtrace/origin?vhost=www.site1.com http://127.0.0.1:10040/monitoring/logtrace/monitoring?vhost=www.site1.com .. _monitoring_counter: 카운터 ==================================== 실시간(1~30초)으로 URL depth기반 요청수를 집계한다. 요청수에는 바이패스도 포함된다. .. note:: 단기 휘발성 데이터이기에 ```` 기능으로 분류한다. :: # server.xml - # vhosts.xml - - ``Status (기본: Inactive)`` ``Active`` 로 설정하면 카운터를 활성화한다. - ``Value (기본: 1)`` 카운팅할 URL depth를 지정한다. :: /assets/prd/sample.jpg /assets/images/sample.jpg?a=1 /assets/images/private/test/logo.png # Value="1" 이라면 동일한 카운터로 간주하여 3회를 카우팅한다. /assets/ # Value="2" 라면 1회, 2회로 나누어 카운팅한다. /assets/prd/ /assets/images/ .. warning:: 지나치게 큰 값을 넣어 모든 URL을 카운팅할 경우 메모리 과다사용 문제가 발생할 수 있다. - ``Duration (기본: 10초, 최대: 30초)`` 카운터 집계기준을 지정한다. .. _monitoring_counter_api: 카운터 API --------------------- 카운팅 상태를 API로 조회할 수 있다. :: /monitoring/counter?vhost={가상호스트} /monitoring/counter?vhost={가상호스트}&dur={1~30} depth별 요청수가 우선순위로 정렬되어 제공된다.